C# DLL einbinden, Struct als Referenz übergeben

Gast #7193221
Lesenswert?

Hallo,

ich habe eine Frage zum Einbinden einer DLL in ein Projekt unter C#.
Der generelle Ablauf ist mir klar DllImport, extern Deklaration, etc.
Aber was mache ich wenn ich ein Struct per Referenz an die Funktion in 
der DLL übergeben muss, wie gehe ich sicher, dass das Struct gleich 
gepackt ist?
Gast #7193915
Lesenswert?

Klaus P. schrieb:
> Dafür gibt es das StructLayoutAttribute:
> 
https://docs.microsoft.com/de-de/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack?view=net-6.0

Das ist natürlich klar, verrät jedoch nicht wie das Struct in der DLL 
gepackt ist. Der Hersteller der DLL hat nur einfach eine dürftige 
Beschreibung der Member des Struct gegeben, ohne irgendwo auf das 
padding/packing einzugehen. Es ist noch nicht mal dokumentiert welche 
Größe ein int darin hat.
Gast #7193920
Lesenswert?

Tim T. schrieb:
> Das ist natürlich klar, verrät jedoch nicht wie das Struct in der DLL
> gepackt ist. Der Hersteller der DLL hat nur einfach eine dürftige
> Beschreibung der Member des Struct gegeben, ohne irgendwo auf das
> padding/packing einzugehen.

Ohne diese Information kommst du von C# aus nicht da dran. Das geht dann 
selbst von C/C++ aus nicht. Hast du keinen C/C++-Header mit der 
struct-Deklaration? Das Padding und Integer-Größen ergeben sich 
normalerweise aus den Standards der Plattform. Im Zweifelsfall halt 
ausprobieren.
Gast #7193997
Lesenswert?

Tim T. schrieb:
> ich habe eine Frage zum Einbinden einer DLL in ein Projekt unter C#.
> Der generelle Ablauf ist mir klar DllImport, extern Deklaration, etc.

P/Invoke ist eine Variante. Kannst auch mit C++/CLI nen Import-Wrapper 
bauen.

> Aber was mache ich wenn ich ein Struct per Referenz an die Funktion in
> der DLL übergeben muss, wie gehe ich sicher, dass das Struct gleich
> gepackt ist?

Kommt drauf an. Wenn das Alignment halt zum Default passt, z.B. bloß 
int/unsigned-Dinger da als Felder drinne sind, keine Bitfields oder 
bools der quere drine, könnteste mit einfachem Ausprobieren und Mapping 
der C#-Struct schon Glück haben. Vielleicht gibts auch was fertiges bei 
pinvoke.net.

Zur Not kannste dir aber trotzdem die fertige Dll in ein C++-Testprojekt 
importieren und das Padding/Alignment halt rausprobieren - mit höchstem 
Compilerwarnings /W4 /Wall müsste der dir das eigentlich auch anzeigen, 
wenns abweicht.

Ich würd ne Mixed-Assembly mit C++/CLI machen, den Fremd-Code da 
reinimportieren und gut ist.
Gast #7194688
Lesenswert?

Tim T. schrieb:

> Das ist natürlich klar, verrät jedoch nicht wie das Struct in der DLL
> gepackt ist. Der Hersteller der DLL hat nur einfach eine dürftige
> Beschreibung der Member des Struct gegeben, ohne irgendwo auf das
> padding/packing einzugehen. Es ist noch nicht mal dokumentiert welche
> Größe ein int darin hat.

Dann taugt der Scheiß einfach zu garnix. Weg damit.
Gast #7207827
Lesenswert?

Hab vielleicht noch was gefunden, was helfen könnte zur o.g. 
Problematik.

Grundsätzliche Sache ist ja, dass die Toolchain und die 
padding/alignment-pragmas/-settings unbekannt sind, die zur Erstellung 
der DLL genutzt worden sind.

Da du mit .net rummachst, haste sicherlich auch das visuelle Studio im 
Einsatz, welcher dir unter 'Extras' eine 'Visual Studio 
Eingabeaufforderung' zur Verfügung stellt. Ist quasi nix anderes als ne 
normale cmd.exe, wo halt ein vcvars32.bat (oder so ähnlich) aufgerufen 
wurde.

Darin gibts n nettes Tool, nennt sich dumpbin.exe, das kannste mal auf 
deine Import-Lib von der DLL loslassen (z.B. Parameter /HEADERS). Mit 
bissl Glück, steht da was von Alignment drin. Kannst dir damit wohl auch 
Import-Libraries generieren, in Verbindung mit lib.exe und einem 
.def-File. Und spätestens da sollteste das Teil in ne Mixed-Assembly 
einbinden können.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren