C# DLL einbinden, Struct als Referenz übergeben

Gast #7193221
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.