Maison > développement back-end > C++ > Comment résoudre les erreurs « Accès refusé » lors de l'intégration de DLL non gérées dans des DLL C# gérées ?

Comment résoudre les erreurs « Accès refusé » lors de l'intégration de DLL non gérées dans des DLL C# gérées ?

DDD
Libérer: 2025-01-05 17:54:41
original
708 Les gens l'ont consulté

How to Resolve

Comment intégrer des DLL non gérées dans des DLL C# gérées

Contexte

Intégration de DLL non gérées dans Les DLL C# gérées sont une technique qui permet une utilisation transparente du code natif dans les projets .NET. Microsoft prend en charge cette fonctionnalité, comme indiqué ici :

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

Erreur : Accès refusé (0x80070005)

Malgré l'approche recommandée, les utilisateurs peuvent rencontrer l'exception suivante :


L'accès est refusé. (Exception de HRESULT : 0x80070005
(E_ACCESSDENIED))


Solution : extraire et charger explicitement la DLL

Pour résoudre ce problème, la DLL non gérée doit être extrait dans un répertoire temporaire et chargé explicitement à l'aide de LoadLibrary avant d'utiliser P/Invoke. Cette technique garantit que les ressources sont correctement accessibles et que la dépendance est établie correctement.

Exemple de code

Le code suivant illustre cette approche :

// 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);
Copier après la connexion

En suivant cette approche, les développeurs peuvent intégrer des DLL non gérées dans des DLL C# gérées et utiliser avec succès les appels P/Invoke sans se heurter à un accès refusé. erreurs.

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal