Benutzer mit den meisten Antworten
DllNotFoundException beim Zugriff auf eine deklarierte Funktion ...

Frage
-
Ich bemühe mich derzeit ein Beispielprogramm der Fa. FTDI zum Laufen zu bekommen.
Es handelt sich um eine Software, die zur Kommunikation mit externer Elektronik das SPI-Protokoll nutzt.
Zur Umsetzung wird ein FTDI-Chip genutzt und dessen MPSSE (Multi Protocol ....) genutzt.
Zum VB.Net Programm gehört noch eine Dll (FTCSPI.DLL), die heruntergeladen wurde und an verschiedenen Stellen im Compi vorhanden ist (u.a. Windows\System32)
Die Funktionen sind etwa wie folgt im Programm deklariert:
Private DeclareFunctionSPI_GetNumDevices Lib"ftcspi"(ByRefNumDevices AsLong) AsInteger
Dennoch erhalte ich eine DllNotFoundException,sobald auf eine der Dll-Funktionen zugegriffen wird.
System.DllNotFoundException wurde nicht behandelt.
Message=Die DLL "ftcspi": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
Source=FT2232CSPIVBNETTestApp
TypeName=""
StackTrace:
bei FT2232CSPIVBNETTestApp.MainForm.SPI_GetNumDevices(Int64& NumDevices)
bei FT2232CSPIVBNETTestApp.MainForm.TestButton_Click(Object sender, EventArgs e) in C:\Users\administrator\Documents\FT2232CSPIVBNETTestApp\MainForm.vb:Zeile 275.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei FT2232CSPIVBNETTestApp.MainForm.Main() in C:\Users\administrator\Documents\FT2232CSPIVBNETTestApp\MainForm.vb:Zeile 0.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:Für mich hört sich das an, als ob die DLL schlicht nicht gefunden wird.
Andererseits sind Versuche, die DLL als Verweis dem Prog hinzuzufügen an einer Fehlermeldung gescheitert.
Es handelt sich mit Wahrscheinlichkeit nicht um eine managed DLL
Kann mir jemand helfen ?
Antworten
-
Hallo Nico,
die DLL ist nicht managed und die Beispielprogramme wie man sie unter
http://www.ftdichip.com/Support/SoftwareExamples/MPSSE/FTCSPI.htm
findet, sind mit extremer Vorsicht zu "genießen".
So sind die Declares offensichtlich unbesehen von VB 6 auf VB.NET übernommen worden.
Das dort die Datentypen (wie long) eine andere Größe haben, hat man außen vor gelassen.
Falls Du korrigierte Versionen verwendest (bzw. finden kannst) solltest Du die verwenden.
Die DLL alleine reicht nicht, zusätzlich brauchst Du die Treiber, FTD2XX.DLL, die als Abhängigkeit geladen wird,
Downloadseite sollte sein http://www.ftdichip.com/Drivers/D2XX.htm.Damit die DLL gefunden wird, binde sie in das Projekt als Inhalt ein und lasse sie ins Ausgabeverzeichnis kopieren.
Gruß Elmar
Das Projekt muss als X86 übersetzt werden, da die DLL als 32-Bit vorliegt.- Bearbeitet Elmar Boye Dienstag, 18. September 2012 08:02
- Als Antwort markiert Robert Breitenhofer Dienstag, 25. September 2012 09:46
-
Hallo Nico,
ich habe das Programm mit FTCSPI und den Treiber DLLs zum Laufen bekommen,
nur das sich beim Test-Button mangels zugehöriger Hardware nichts mehr rührt...Mehr testen kann ich somit nicht.
FTD2XX war hier schon mehrfach vertreten lt. MSDN-Foren-Suche
Gruß Elmar
- Als Antwort markiert Robert Breitenhofer Dienstag, 25. September 2012 09:46
Alle Antworten
-
Private DeclareFunctionSPI_GetNumDevices Lib"ftcspi"(ByRefNumDevices AsLong) AsInteger
System.DllNotFoundException wurde nicht behandelt.
Message=Die DLL "ftcspi": Das angegebene ModulHallo Nico,
das die DLL eine DLL ist, must Du VB schon auch noch mitteilen; siehe MSDN Declare Anweisung =>
Private Declare Function SPI_GetNumDevices Lib"ftcspi.dll"(ByRefNumDevices AsLong) As Integer
Und nein, eine Managed Assembly ist es nicht, die würde man einfach referenziern.
Olaf Helper
Blog Xing -
Hallo Nico,
die DLL ist nicht managed und die Beispielprogramme wie man sie unter
http://www.ftdichip.com/Support/SoftwareExamples/MPSSE/FTCSPI.htm
findet, sind mit extremer Vorsicht zu "genießen".
So sind die Declares offensichtlich unbesehen von VB 6 auf VB.NET übernommen worden.
Das dort die Datentypen (wie long) eine andere Größe haben, hat man außen vor gelassen.
Falls Du korrigierte Versionen verwendest (bzw. finden kannst) solltest Du die verwenden.
Die DLL alleine reicht nicht, zusätzlich brauchst Du die Treiber, FTD2XX.DLL, die als Abhängigkeit geladen wird,
Downloadseite sollte sein http://www.ftdichip.com/Drivers/D2XX.htm.Damit die DLL gefunden wird, binde sie in das Projekt als Inhalt ein und lasse sie ins Ausgabeverzeichnis kopieren.
Gruß Elmar
Das Projekt muss als X86 übersetzt werden, da die DLL als 32-Bit vorliegt.- Bearbeitet Elmar Boye Dienstag, 18. September 2012 08:02
- Als Antwort markiert Robert Breitenhofer Dienstag, 25. September 2012 09:46
-
Vielen Dank erstmal.
Ich habe jetzt mal von "Any CPU" auf "x86" umgestellt; jetzt startet die Anwendung gar nicht mehr.
Ich werde mal weiter rumprobieren.
Hat jemand Erfahrung mit der "Wrapper-DLL" für .NET ? Zumindest ist für mich nicht erkennbar, ob diese DLL die gleichen Funktionen enthält.
-
Hallo Nico,
ich habe das Programm mit FTCSPI und den Treiber DLLs zum Laufen bekommen,
nur das sich beim Test-Button mangels zugehöriger Hardware nichts mehr rührt...Mehr testen kann ich somit nicht.
FTD2XX war hier schon mehrfach vertreten lt. MSDN-Foren-Suche
Gruß Elmar
- Als Antwort markiert Robert Breitenhofer Dienstag, 25. September 2012 09:46
-
Hallo NicoNi,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat. Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.
Hier noch die Datei FTCSPI.h:
http://www.codeforge.com/read/45286/FTCSPI.h__html
http://www.verysource.com/code/1565842_1/ftcspi.h.html
In diese Header-Dateien sehe ich folgende Signatur: FTCSPI_API
FTC_STATUS WINAPI SPI_GetNumDevices(LPDWORD lpdwNumDevices); … und mehr oben typedef ULONG FTC_STATUS;
Wenn ich jetzt indem Artikel Marshaling Data with Platform Invoke à Platform Invoke Data Types die Tabelle anschaue sehe ich folgendes:
ULONG à unsigned long à System.UInt32 à 32 bits …also ULONG wird in System.UInt32 übersetzt.
Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.