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

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

Susan Sarandon
Freigeben: 2024-12-31 21:43:10
Original
946 Leute haben es durchsucht

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

Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs

Problem:

Wie können Sie eine nicht verwaltete C-DLL in eine verwaltete einbetten? C#-DLL verwenden DLLImport?

Antwort:

Obwohl grundsätzlich davon abgeraten wird, nicht verwaltete DLLs in verwaltete DLLs einzubetten, kann dies durch Extrahieren der nicht verwalteten DLL in ein temporäres Verzeichnis während der Initialisierung und erreicht werden Laden Sie es vor der Verwendung explizit mit LoadLibrary P/Invoke.

Implementierung:

  1. Extrahieren Sie die nicht verwaltete DLL: Bestimmen Sie ein temporäres Verzeichnis zum Speichern der nicht verwalteten DLL mithilfe von Versionsnummer der Assembly, um Versionskonflikte zu vermeiden. Extrahieren Sie den eingebetteten Ressourcenstream, der die DLL enthält, in dieses Verzeichnis.
  2. DLL laden: Laden Sie die extrahierte DLL explizit mit LoadLibrary. Das temporäre Verzeichnis befindet sich möglicherweise nicht im Systempfad, daher ist dies für P/Invoke-Anweisungen erforderlich, um die DLL zu finden.

Beispielcode:

// Get temporary directory with assembly version in path
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version);
Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");

// Get embedded resource stream and copy DLL to temporary file
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
    using (Stream outFile = File.Create(dllPath))
    {
        const int sz = 4096;
        byte[] buf = new byte[sz];
        while (true)
        {
            int nRead = stm.Read(buf, 0, sz);
            if (nRead < 1)
                break;
            outFile.Write(buf, 0, nRead);
        }
    }
}

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

Beachten Sie, dass dieser Ansatz seine Vorteile hat, z. B. dass alles in einer einzigen Datei gespeichert wird. Die Verknüpfung der nicht verwalteten DLL mit der Assembly als separate Datei wird jedoch sowohl aus Sicherheitsgründen als auch im Allgemeinen empfohlen Einfachheit.

Das obige ist der detaillierte Inhalt vonWie kann ich eine nicht verwaltete DLL in eine verwaltete C#-DLL einbetten?. 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