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