Laden...

Klassenbibliothek, die externe native DLL benutzt, erstellen und zu einer DLL zusammenfügen

Erstellt von skullsplitter vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.693 Views
S
skullsplitter Themenstarter:in
23 Beiträge seit 2011
vor 11 Jahren
Klassenbibliothek, die externe native DLL benutzt, erstellen und zu einer DLL zusammenfügen

Hallo!

Ich stehe derzeit vor folgendem Problem:

ich habe mit Visual Studio 2010 ein neues Projekt erstellt, um eine Klassenbibliothek zu erstellen (C#).

Daher: VS -> Neu -> Projekt -> Visual C# -> Windows -> Klassenbibliothek (zum Erstellen einer C# Klassenbibliothek (DLL).

Also genau das was ich möchte.
Ich möchte meinen Code mit einer DLL einfach zur Verfügung stellen können.

Jetzt benötigt mein Code allerdings eine externe .DLL (keine .NET!)

Daher:
rechte Maus auf das Projekt -> Verweis hinzufügen -> Durchsuchen -> .DLL suchen und einbinden

Anschließend habe ich bei den Eigenschaften der DLL eingestellt, dass eine lokale Kopie erstellt werden soll.

Meine Frage nun:
Wenn ich das Projekt erstelle, dann habe ich im Debug-Ordner 2 .DLL Dateien.

Einmal die extern eingebundene und eine welche meine Klassenbibliothek darstellt.

Ist es irgendwie möglich, dass ich nur eine DLL erhalte? Also, dass meine Klassenbibliothek die externe DLL beinhaltet?

Vielen Dank!

Gruß
Stefan

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo skullsplitter,

mehrere .NET DLL (Assemblies) könnte man mergen, aber nicht eine .NET DLL mit einer nativen DLL.

Davon abgesehen sollte es egal sein, ob man eine oder zwei DLLs ausliefert.

herbivore

S
skullsplitter Themenstarter:in
23 Beiträge seit 2011
vor 11 Jahren

Hallo herbivore,

vielen Dank für die schnelle Antwort. 😃

Habe ich dich richtig verstanden: in meinem Fall ist es nicht möglich aus den zwei DLLs eine einzige zu machen?

Der Grund für meine Frage ist, dass es gewünscht wäre, dass nur eine DLL ausgeliefert werden muss und nicht zwei.

Vielen Dank,

Gruß,
Stefan

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo skullsplitter,

man kann die native DLL als Ressource in die .NET DLL einbetten, müsste erste aber [nach meinem momentanen Kenntnisstand] rechtzeitig wieder auspacken und auf der Platte speichern, damit darauf zugegriffen werden kann. Ob man das rechtzeitig schafft, ist die Frage. Aber selbst wenn es gelingt, hat man zumindest zur Laufzeit wieder zwei DLLs auf der Platte. Kurz gesagt: lass die Finger davon.

Ansonsten wurde das Thema schon x-mal besprochen, wenn auch meistens für das Einbetten von DLLs in eine EXE. Benutze bei Bedarf die Forensuche.

herbivore

W
872 Beiträge seit 2005
vor 11 Jahren

Du kannst natuerlich Managed C++ verwenden und dann statisch linken, wenn Du partout eine DLL haben willst.

S
248 Beiträge seit 2008
vor 11 Jahren

Hallo skullsplitter,

es gibt eine Möglichkeit eine managed und eine unmanaged dll zu mergen.
Der .NET Wrapper von SQLite verwendet diese zum Beispiel.
Das Tool heisst Mergebin. Es bettet eine der beiden in die andere ein.

Hier gibts ein paar Informationen

Hier habe ich den Sourcecode gefunden.

Vielleicht gibts Mergebin auch irgendwo fertig zum runterladen.

Grüße spooky

309 Beiträge seit 2008
vor 11 Jahren

@Spook:
Mergebin ist auch im offiziellen Repository vom ADO.NET 2.0 Provider für SQLite auf Sourceforge verfügbar:
http://sqlite-dotnet2.cvs.sourceforge.net/viewvc/sqlite-dotnet2/SQLite.NET/tools/mergebin/

Ich konnte die VS-Solution problemlos in VS laden und kompilieren.

Allerdings muss die native DLL bestimmte Voraussetzungen erfüllen.

Zitat aus Ilmerge:

The native DLL must have an unused section in it, into which the
.NET assembly will be inserted. You can do this with the following code:
#pragma data_seg(".clr")
#pragma comment(linker, "/SECTION:.clr,ER")
char __ph[92316] = {0}; // 92316 is the number of bytes to reserve
#pragma data_seg()
You would then specify /SECTION:.CLR in the command-line for the location to
insert the .NET assembly. The number of bytes reserved in the section needs
to be equal to or more than the number of bytes returned by the /I parameter.

The native DLL must also export a function that calls _CorDllMain in
MSCOREE.DLL. This function must have the same parameters and calling
conventions as DllMain, and its name must have the word "CORDLLMAIN"
in it.

Die verrausetzungen dürfte kaum eine DLL haben, da sie speziell kompiliert werden muss.
Da der Sourcecode benötigt wird, man genauso gut gleich eine Mixed Mode Assembly erstellen.
Siehe: Gemischte (systemeigene und verwaltete) Assemblys

Tante Edit meint:

https://github.com/fancycode/MemoryModule

Ist im Endeffekt genau das was du suchst. Ist reiner C Code mit viel WIN-API.
Sowas hab ich auch schon mal gesucht. Der Code sollte sich (theoretisch) relativ leicht in .net Umsetzen lassen.
Mal schauen, solche Sachen (C/Native <-> .net Interop) finde ich immer sehr spannend, evtl. hab ich mal Lust und Laune und setzte mich mal da ran. 😁

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}