Heim >Backend-Entwicklung >C++ >Wie kann der Fehler „Zugriff verweigert' beim Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs behoben werden?

Wie kann der Fehler „Zugriff verweigert' beim Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs behoben werden?

DDD
DDDOriginal
2025-01-05 17:54:41633Durchsuche

How to Resolve

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!

Stellungnahme:
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