Ich habe eine verwaltete C # -Dll, die eine nicht verwaltete C ++ - DLL mit DLLImport verwendet. Alles funktioniert super. Ich möchte diese nicht verwaltete DLL jedoch in meine verwaltete DLL einbetten, wie von Microsoft dort erläutert:
Also habe ich die nicht verwaltete DLL-Datei zu meinem verwalteten DLL-Projekt hinzugefügt, die Eigenschaft auf 'Embedded Resource' gesetzt und den DLLImport wie folgt geändert:
[DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null",
CallingConvention = CallingConvention.Winapi)]
Dabei ist 'Wrapper Engine' der Assemblyname meiner verwalteten DLL. 'Unmanaged Driver.dll' ist die nicht verwaltete DLL
Wenn ich renne, bekomme ich:
Der Zugriff wird verweigert. (Ausnahme von HRESULT: 0x80070005 (E_ACCESSDENIED))
Ich habe von MSDN und von http://blogs.msdn.com/suzcook/ gesehen, dass das möglich sein soll ...
Antworten:
Sie können die nicht verwaltete DLL als Ressource einbetten, wenn Sie sie während der Initialisierung selbst in ein temporäres Verzeichnis extrahieren und vor der Verwendung von P / Invoke explizit mit LoadLibrary laden. Ich habe diese Technik verwendet und sie funktioniert gut. Sie können es vorziehen, es einfach als separate Datei mit der Assembly zu verknüpfen, wie Michael bemerkte, aber alles in einer Datei zu haben, hat seine Vorteile. Hier ist der Ansatz, den ich verwendet habe:
quelle
Hier ist meine Lösung, die eine modifizierte Version von JayMcClellans Antwort ist. Speichern Sie die folgende Datei in einer class.cs-Datei.
quelle
Ich wusste nicht, dass dies möglich ist - ich würde vermuten, dass die CLR die eingebettete native DLL irgendwo extrahieren muss (Windows benötigt eine Datei, damit die DLL sie laden kann - sie kann kein Bild aus dem Rohspeicher laden) und wo auch immer Es wird versucht, dass der Prozess keine Berechtigung hat.
So etwas wie Process Monitor von SysInternals gibt Ihnen möglicherweise einen Hinweis, wenn das Pronblem lautet, dass das Erstellen der DLL-Datei fehlschlägt ...
Aktualisieren:
Ah ... jetzt, da ich den Artikel von Suzanne Cook lesen konnte (die Seite ist mir vorher nicht erschienen), beachte, dass sie nicht über das Einbetten der nativen DLL als Ressource in die verwaltete DLL spricht, sondern vielmehr als verknüpfte Ressource - Die native DLL muss weiterhin eine eigene Datei im Dateisystem sein.
Siehe http://msdn.microsoft.com/en-us/library/xawyf94k.aspx , wo es heißt:
Dies scheint der Assembly Metadaten hinzuzufügen, die dazu führen, dass die native DLL logisch Teil der Assembly ist (obwohl es sich physisch um eine separate Datei handelt). Dinge wie das Einfügen der verwalteten Assembly in den GAC enthalten also automatisch die native DLL usw.
quelle
Sie können Costura.Fody ausprobieren . Die Dokumentation besagt, dass nicht verwaltete Dateien verarbeitet werden können. Ich habe es nur für verwaltete Dateien verwendet und es funktioniert wie ein Zauber :)
quelle
Man könnte die DLLs auch einfach in einen beliebigen Ordner kopieren und dann SetDllDirectory in diesen Ordner aufrufen . Dann ist kein Aufruf von LoadLibrary erforderlich.
quelle