L'intégration d'une DLL non gérée dans une DLL C# gérée est un moyen pratique de regrouper les ressources nécessaires et de réduire la gestion des dépendances. Cette question concerne une exception « Accès refusé » rencontrée lors de la tentative d'intégration d'une DLL non gérée à l'aide de l'attribut DllImport.
La solution fournie consiste à extraire la DLL non gérée dans un répertoire temporaire lors de l'initialisation. Cette étape implique d'accéder au flux de ressources intégré et de copier le contenu de la DLL vers l'emplacement temporaire. La DLL extraite est ensuite explicitement chargée à l'aide de LoadLibrary avant d'utiliser les appels P/Invoke.
// Extract and load the unmanaged DLL. string dllPath = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version.ToString(), "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); } } } IntPtr h = LoadLibrary(dllPath); Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
Une fois la DLL non gérée chargée, elle est disponible pour être utilisée par les appels DllImport dans la DLL gérée. Cette approche garantit que la version correcte de la DLL non gérée est utilisée, même si plusieurs applications avec des versions différentes s'exécutent simultanément.
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!