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:
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);
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!