Maison >développement back-end >C++ >Comment intégrer des DLL non gérées dans des DLL C# gérées et éviter « l'accès est refusé » ?

Comment intégrer des DLL non gérées dans des DLL C# gérées et éviter « l'accès est refusé » ?

DDD
DDDoriginal
2024-12-29 14:32:11864parcourir

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

Intégration de DLL non gérées dans des DLL C# gérées

Lors de l'intégration de DLL non gérées avec du code C# géré, les développeurs rencontrent souvent le besoin d'intégrer ces DLL dans l’assemblage géré. Cet article étudie les problèmes potentiels et propose une solution pour intégrer des DLL non gérées dans des DLL gérées.

Énoncé du problème

Un développeur tente d'intégrer une DLL non gérée dans un C# géré. DLL utilisant l'attribut DllImport, comme recommandé par Microsoft. Cependant, lors de l'exécution du code, une exception « Accès refusé » est levée.

Solution

Bien que la documentation MSDN suggère la faisabilité de l'intégration de DLL non gérées, elle échoue pour résoudre le problème sous-jacent lié aux autorisations d’accès aux DLL. La solution suivante résout efficacement ce problème :

  1. Extraire la DLL non gérée : Lors de l'initialisation, extrayez la DLL non gérée de la ressource intégrée vers un répertoire temporaire.
  2. Charger explicitement la DLL : Après l'extraction, utilisez la fonction LoadLibrary pour charger explicitement la DLL dans le processus.
  3. Utiliser DllImport :Une fois la DLL chargée, les directives DllImport la faisant référence utiliseront la version déjà chargée.

Voici un exemple d'implémentation de cette approche. :

// 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);

En suivant ces étapes, les développeurs peuvent intégrer avec succès des DLL non gérées dans des fichiers gérés. DLL C#, surmontant l'exception « Accès refusé » et libérant tout le potentiel de cette technique d'intégration.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn