myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Entwicklungs- und Laufzeitumgebung (Infrastruktur) » Klassenbibliothek, die externe native DLL benutzt, erstellen und zu einer DLL zusammenfügen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
skullsplitter
myCSharp.de-Mitglied

Dabei seit: 08.02.2011
Beiträge: 23


skullsplitter ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 18.07.2012 08:37.

18.07.2012 08:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
18.07.2012 08:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
skullsplitter
myCSharp.de-Mitglied

Dabei seit: 08.02.2011
Beiträge: 23

Themenstarter Thema begonnen von skullsplitter

skullsplitter ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
18.07.2012 08:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
18.07.2012 09:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
weismat
myCSharp.de-Mitglied

Dabei seit: 20.09.2005
Beiträge: 872
Entwicklungsumgebung: Vistual Studio 2017, VS Code
Herkunft: Frankfurt am Main


weismat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du kannst natuerlich Managed C++ verwenden und dann statisch linken, wenn Du partout eine DLL haben willst.
19.07.2012 09:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Spook Spook ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.10.2008
Beiträge: 211
Entwicklungsumgebung: VS2019
Herkunft: Esslingen a.N.


Spook ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
19.07.2012 10:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Scavanger Scavanger ist männlich
myCSharp.de-Mitglied

avatar-3209.jpg


Dabei seit: 13.03.2008
Beiträge: 307
Entwicklungsumgebung: MS VS C# 2010/2013 Prof.


Scavanger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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. großes Grinsen

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Scavanger am 19.07.2012 23:29.

19.07.2012 16:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 7 Jahre.
Der letzte Beitrag ist älter als 7 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 12.07.2020 13:48