Maison > développement back-end > C++ > Comment puis-je intégrer une DLL non gérée dans une DLL C# gérée ?

Comment puis-je intégrer une DLL non gérée dans une DLL C# gérée ?

Susan Sarandon
Libérer: 2024-12-31 21:43:10
original
946 Les gens l'ont consulté

How Can I Embed an Unmanaged DLL within a Managed C# DLL?

Intégration de DLL non gérées dans des DLL C# gérées

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 :

  1. Extraire la DLL non gérée : Déterminez un répertoire temporaire pour stocker la DLL non gérée, à l'aide du numéro de version de l'assembly pour éviter les conflits de version. Extrayez le flux de ressources intégré contenant la DLL dans ce répertoire.
  2. Chargez la DLL : chargez explicitement la DLL extraite à l'aide de LoadLibrary. Le répertoire temporaire peut ne pas se trouver dans le chemin système, cela est donc nécessaire pour que les directives P/Invoke localisent la DLL.

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

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!

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