Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Klassenbibliothek, die externe native DLL benutzt, erstellen und zu einer DLL zusammenfügen
skullsplitter
myCSharp.de - Member



Dabei seit:
Beiträge: 24

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von skullsplitter am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
skullsplitter
myCSharp.de - Member



Dabei seit:
Beiträge: 24

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Du kannst natuerlich Managed C++ verwenden und dann statisch linken, wenn Du partout eine DLL haben willst.
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 233
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

beantworten | zitieren | melden

@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:
Zitat
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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Scavanger am .

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));}}
private Nachricht | Beiträge des Benutzers