Moin, ich habe ein zu einem DAQ eine Library mit VS-Sampleprojekt bekommen. Das ist alles in C/C++ (kein OO) geschrieben. Letzendlich verweist das Sampleprojekt auf zwei .h-Files, deren Dateiname der .dll-Datei bzw. .lib-Datei entsprechen. Soweit ich weiß, nennt sich das implizites Einbinden von DLLs. Ich habe die DLL und einen zugehörigen Header. Jetzt möchte ich diese DLL in C# nutzen. Wie wäre da prinzipiell das vorgehen? Muss ich das Header-File anpassen, was macht diese .lib-Datei bzw. wie muss die DLL eingebunden werden? Danke + Grüße!
Marcus schrieb: > Soweit ich weiß, nennt sich das implizites Einbinden von DLLs. Ich habe > die DLL und einen zugehörigen Header. Und eine .lib-Datei. Deswegen funktioniert das Ganze in C und C++ recht einfach (die lib wird eingebunden und zur Laufzeit werden die Funktionen der DLL aufgerufen). https://msdn.microsoft.com/en-us/library/253b8k2c.aspx > Jetzt möchte ich diese DLL in C# nutzen. Wie wäre da prinzipiell das > vorgehen? P/Invoke oder ein Wrapper in C++/CLI (einer der wenigen sinnvollen Anwendungsfälle dieser C++-Erweiterung, da C++/CLI sowohl "reines" C++ als auch .NET kann). > Muss ich das Header-File anpassen Nein, nützt nichts. C# ist diesbezüglich eher wie Java und kennt keine Header-Dateien. > was macht diese .lib-Datei In C#: Nichts - oder Fehler beim Versuch, sie einzubinden. Die ist für C oder C++.
Hallo, in brauchst eigentlich nur die dll. Hier ist ein netter Artikel drüber https://www.codeproject.com/Articles/9826/How-to-create-a-DLL-library-in-C-and-then-use-it-w
Etwas schwierig sind bei P/Invoke manchmal Zeiger und komplexere Strukturen; so einfach wie im Tutorial ist es oft leider nicht (die Fehlermeldungen sind auch selten hilfreich). Hier noch ein paar Infos (links die Themen). https://msdn.microsoft.com/de-de/library/s97shtze.aspx
Okay, das hilft schon einmal. Ich würde also einfach in C# eine Klasse erstllen, wo die Funktionen dem "alten" Header-File entsprechen. Wie gehe ich dann bei Structs oder Pointer/Ref als Übergabeparameter vor? Bsp. im Header: int32_t DAQAPI DAQInputConfig(int32_t instance, int32_t ID, int32_t ch, DAQAPI_ChConf *cfg); und das Strukt: typedef struct { double voltage; double current; double upperlimit; double lowerlimit; }DAQAPI_ChConf; Wie müsste ich das in der C#-Klasse definieren? Habe leider in meiner Literatur nichts finden können. Ich vermute ungefähr so: namespace test{ class DAQAPI{ [DllImport("DAQLib.dll")] public static extern int32 DAQInputConfig(int32 instance, int32 ID, int32 ch, Und hier?); } } DLLImport vor jede Funktion? Oder reicht einmal zu Anfang definieren?
Marcus schrieb: > Bsp. im Header: > > int32_t DAQAPI DAQInputConfig(int32_t instance, int32_t ID, int32_t ch, > DAQAPI_ChConf *cfg); > > und das Strukt: > > typedef struct { > double voltage; > double current; > double upperlimit; > double lowerlimit; > }DAQAPI_ChConf; > > Wie müsste ich das in der C#-Klasse definieren? Habe leider in meiner > Literatur nichts finden können. Ich vermute ungefähr so: > > namespace test{ > class DAQAPI{ > [DllImport("DAQLib.dll")] > public static extern int32 DAQInputConfig(int32 instance, int32 ID, > int32 ch, Und hier?); > } > } Diese Funktion ist doch wirklich trivial umzusetzen, du findest Tausende von Beispielen für solche einfachen Konstrukte bei pinvoke.net. Das Grundprinzip ist immer: deklariere eine entsprechende Struktur in der .net-Sprache und benutze die mittels ref (bzw. in VB: ByRef). Eine leichte Steigerung davon sind "packed" Strukturen, aber auch die lassen sich noch ziemlich leicht in den Griff bekommen. Der Trick steckt hier vor allem in einer passenden Strukturdeklaration. Siehe Namespace System.Runtime.InteropServices, speziell: StructLayout(). Richtig schwierig wird es erst bei Unions, bei Strukturen mit variabler Länge und/oder bei Strukturen, die ihrerseits wieder Zeiger enthalten. Da muss man dann schon sehr genau wissen, was man tut. > DLLImport vor jede Funktion? Natürlich gehört DllImport vor jede zu importierende Funktion.
@Plauzi, vielen Dank! @c-hater: wäre es so trivial, würde ich nicht fragen. Ich habe eben nichts gefunden. Aber ebenfalls danke für die Hilfe! Gut, das so offensichtlich höchqualifizierte Personen auch dämliche Fragen beantworten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.