Heim > Backend-Entwicklung > C++ > Wie kann ich eine nicht verwaltete DLL erfolgreich in eine verwaltete C#-DLL einbetten und verwenden?

Wie kann ich eine nicht verwaltete DLL erfolgreich in eine verwaltete C#-DLL einbetten und verwenden?

Patricia Arquette
Freigeben: 2024-12-29 07:44:09
Original
367 Leute haben es durchsucht

How Can I Successfully Embed and Use an Unmanaged DLL within a Managed C# DLL?

Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs

Das Einbetten nicht verwalteter DLLs in verwaltete DLLs ist eine nützliche Technik zum Konsolidieren und Schützen von Abhängigkeiten. Es kann jedoch schwierig sein, dies zu erreichen.

Problem:

Beim Versuch, eine nicht verwaltete DLL mithilfe von DllImport in eine verwaltete DLL einzubetten, tritt die Fehlermeldung „Zugriff verweigert“ auf.

Erklärung:

Zum Einbetten eines Wenn Sie eine nicht verwaltete DLL als Ressource verwenden möchten, müssen Sie über das einfache Hinzufügen als eingebettete Ressource im Projekt hinaus weitere Schritte unternehmen.

Lösung:

Um eine erfolgreich einzubetten und zu verwenden nicht verwaltete DLL in einer verwalteten DLL:

  1. Eingebettete Datei extrahieren und laden DLL:

    • Extrahieren Sie die nicht verwaltete DLL aus dem eingebetteten Ressourcenstream in ein temporäres Verzeichnis.
    • Laden Sie die extrahierte DLL explizit mit LoadLibrary, bevor Sie DllImport verwenden.
  2. Verwenden Sie ein einzigartiges Provisorium Verzeichnis:

    • Erstellen Sie ein eindeutiges temporäres Verzeichnis für jede Version Ihrer Assembly, um Versionskonflikte zu vermeiden.
  3. Handle-Datei Ausnahmen beim Kopieren:

    • Behandeln Sie Ausnahmen beim Versuch, die eingebettete DLL in die zu kopieren temporäres Verzeichnis. Möglicherweise können Sie die Ausnahme ignorieren, wenn die Datei bereits im Verzeichnis vorhanden ist.

Beispielcode:

Der folgende Code Snippet demonstriert den Einbettungsprozess:

// Get a unique temporary directory for this assembly version
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." +
  Assembly.GetExecutingAssembly().GetName().Version.ToString());
if (!Directory.Exists(dirName))
  Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");

// Extract the embedded DLL to the temporary location
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(
  "MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
  using (Stream outFile = File.Create(dllPath))
  {
    CopyBytes(stm, outFile);
  }
}

// Load the extracted DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich eine nicht verwaltete DLL erfolgreich in eine verwaltete C#-DLL einbetten und verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage