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
628 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!

source:php.cn
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