Forum: PC-Programmierung C# DLL einbinden, Struct als Referenz übergeben


von Tim T. (tim_taylor) Benutzerseite


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?

von Bärtram (Gast)


Lesenswert?

Share mal deinen Code bzw. die Signatur der Methode

von Klaus P. (kpi6288)


Lesenswert?


: Bearbeitet durch User
von Tim T. (tim_taylor) Benutzerseite


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.

von Programmierer (Gast)


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.

von db8fs (Gast)


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.

von c-hater (Gast)


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.

von me (Gast)


Lesenswert?

c-hater schrieb:
> Dann taugt der Scheiß einfach zu garnix. Weg damit.

Leider ist das aber sehr häufig der Fall, oft von kleineren Firmen, 
welche ihre Nische haben, und es oft keine Alternative gibt.

von Programmierer (Gast)


Lesenswert?

c-hater schrieb:
> Dann taugt der Scheiß einfach zu garnix. Weg damit.

Hast du ein Beispiel für eine (proprietäre) DLL, deren Dokumentation 
ausführlich auf die Layouts von structs eingeht, mit Padding, Alignment 
etc?

von db8fs (Gast)


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.

von Walter T. (nicolas)


Lesenswert?

Sagt Dependency Walker nichts?

von Hurz (Gast)


Lesenswert?

Poste doch mal die Definition. Vielleicht ist es gar nicht so schlimm, 
wenn alles 32 Bit aligned ist.

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.