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
Freigeben: 2025-01-05 17:54:41
Original
662 Leute haben es durchsucht

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);
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage