Das Einbetten einer nicht verwalteten DLL in eine verwaltete C#-DLL ist eine praktische Möglichkeit, erforderliche Ressourcen zu bündeln und das Abhängigkeitsmanagement zu reduzieren. Diese Frage befasst sich mit einer „Zugriff verweigert“-Ausnahme, die beim Versuch, eine nicht verwaltete DLL mithilfe des DllImport-Attributs einzubetten, aufgetreten ist.
Die bereitgestellte Lösung umfasst das Extrahieren der nicht verwalteten DLL in ein temporäres Verzeichnis während der Initialisierung. Dieser Schritt umfasst den Zugriff auf den eingebetteten Ressourcenstream und das Kopieren der DLL-Inhalte an den temporären Speicherort. Die extrahierte DLL wird dann explizit mit LoadLibrary geladen, bevor P/Invoke-Aufrufe verwendet werden.
// Extract and load the unmanaged DLL. string dllPath = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version.ToString(), "MyAssembly.Unmanaged.dll"); 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); } } } IntPtr h = LoadLibrary(dllPath); Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
Sobald die nicht verwaltete DLL geladen ist, steht sie für die Verwendung durch DllImport-Aufrufe innerhalb der verwalteten DLL zur Verfügung. Dieser Ansatz stellt sicher, dass die richtige Version der nicht verwalteten DLL verwendet wird, auch wenn mehrere Anwendungen mit unterschiedlichen Versionen gleichzeitig ausgeführt werden.
Das obige ist der detaillierte Inhalt vonWie behebe ich den Fehler „Zugriff verweigert' beim Einbetten einer nicht verwalteten DLL in eine verwaltete C#-DLL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!