Forum: PC Hard- und Software C-Lib mit .dll/.lib/.h in C# .net


von Marcus (Gast)


Lesenswert?

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!

von Plauzi (Gast)


Lesenswert?

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++.

von Keiner N. (nichtgast)


Lesenswert?

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

von Plauzi (Gast)


Lesenswert?

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

von Marcus (Gast)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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.

von Marcus (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.