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?
Share mal deinen Code bzw. die Signatur der Methode
Dafür gibt es das StructLayoutAttribute: https://docs.microsoft.com/de-de/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack?view=net-6.0
:
Bearbeitet durch User
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.
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.
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.
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.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.