Heim >Backend-Entwicklung >C++ >Wie kann der Fehler „Zugriff verweigert' beim Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs behoben werden?
So betten Sie nicht verwaltete DLLs in verwaltete C#-DLLs ein
Hintergrund
Einbetten nicht verwalteter DLLs in Bei verwalteten C#-DLLs handelt es sich um eine Technik, die die nahtlose Verwendung von nativem Code in .NET ermöglicht Projekte. Microsoft unterstützt diese Funktion, wie hier beschrieben:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx
Fehler: Zugriff verweigert (0x80070005)
Trotz der Befolgung der empfohlenen Vorgehensweise kann bei Benutzern die folgende Ausnahme auftreten:
Zugriff verweigert. (Ausnahme von HRESULT: 0x80070005
(E_ACCESSDENIED))
Lösung: DLL explizit extrahieren und laden
Um dieses Problem zu beheben, sollte die nicht verwaltete DLL extrahiert werden ein temporäres Verzeichnis und wird explizit mit LoadLibrary geladen, bevor P/Invoke verwendet wird. Diese Technik stellt sicher, dass ordnungsgemäß auf Ressourcen zugegriffen wird und die Abhängigkeit korrekt hergestellt wird.
Codebeispiel
Der folgende Code demonstriert diesen Ansatz:
// Create a temporary directory 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 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 the DLL explicitly IntPtr h = LoadLibrary(dllPath); Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
Durch diesen Ansatz können Entwickler nicht verwaltete DLLs in verwaltete C#-DLLs einbetten und P/Invoke-Aufrufe erfolgreich nutzen, ohne dass ihnen der Zugriff verweigert wird Fehler.
Das obige ist der detaillierte Inhalt vonWie kann der Fehler „Zugriff verweigert' beim Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!