Problème :
Comment intégrer une DLL C non gérée dans un fichier géré DLL C# utilisant DLLImport?
Réponse :
Bien que l'intégration de DLL non gérées dans des DLL gérées soit généralement déconseillée, cela peut être réalisé en extrayant la DLL non gérée dans un répertoire temporaire lors de l'initialisation et le charger explicitement avec LoadLibrary avant de l'utiliser P/Invoke.
Implémentation :
Exemple de code :
// Get temporary directory with assembly version in path string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version); Directory.CreateDirectory(dirName); string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll"); // Get embedded resource stream and copy DLL to temporary file 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 DLL explicitly IntPtr h = LoadLibrary(dllPath); Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
Notez que cette approche a ses avantages, comme celui de tout conserver dans un seul fichier, mais lier la DLL non gérée à l'assembly en tant que fichier séparé est généralement recommandé pour des raisons de sécurité et de sécurité. simplicité.
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!