Heim >Backend-Entwicklung >C++ >Wie kann ich nicht verwaltete DLLs in verwaltete C#-DLLs einbetten und „Zugriff verweigert' vermeiden?

Wie kann ich nicht verwaltete DLLs in verwaltete C#-DLLs einbetten und „Zugriff verweigert' vermeiden?

DDD
DDDOriginal
2024-12-29 14:32:11864Durchsuche

How to Embed Unmanaged DLLs in Managed C# DLLs and Avoid

Einbetten nicht verwalteter DLLs in verwaltete C#-DLLs

Bei der Integration nicht verwalteter DLLs in verwalteten C#-Code stehen Entwickler häufig vor der Notwendigkeit, diese DLLs darin einzubetten die verwaltete Versammlung. Dieser Artikel untersucht die potenziellen Probleme und bietet eine Lösung für die Einbettung nicht verwalteter DLLs in verwaltete DLLs.

Problemstellung

Ein Entwickler versucht, eine nicht verwaltete DLL in ein verwaltetes C# einzubetten. DLL mithilfe des DllImport-Attributs, wie von Microsoft empfohlen. Beim Ausführen des Codes wird jedoch die Ausnahme „Zugriff verweigert“ ausgelöst.

Lösung

Während die MSDN-Dokumentation die Machbarkeit der Einbettung nicht verwalteter DLLs nahelegt, schlägt dies fehl um das zugrunde liegende Problem im Zusammenhang mit DLL-Zugriffsberechtigungen zu beheben. Die folgende Lösung behebt dieses Problem effektiv:

  1. Extrahieren Sie die nicht verwaltete DLL: Extrahieren Sie während der Initialisierung die nicht verwaltete DLL aus der eingebetteten Ressource in ein temporäres Verzeichnis.
  2. DLL explizit laden: Nach der Extraktion verwenden Sie die LoadLibrary-Funktion, um die DLL explizit in die zu laden Prozess.
  3. DllImport verwenden: Sobald die DLL geladen ist, verwenden DllImport-Anweisungen, die darauf verweisen, die bereits geladene Version.

Hier ist eine Beispielimplementierung dieses Ansatzes :

// Extract the unmanaged DLL
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");
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 Befolgen dieser Schritte können Entwickler nicht verwaltete DLLs erfolgreich in verwaltete DLLs einbetten C#-DLLs, die die Ausnahme „Zugriff verweigert“ überwinden und das volle Potenzial dieser Integrationstechnik freisetzen.

Das obige ist der detaillierte Inhalt vonWie kann ich nicht verwaltete DLLs in verwaltete C#-DLLs einbetten und „Zugriff verweigert' vermeiden?. 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