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

Comment puis-je intégrer et utiliser avec succès une DLL non gérée dans une DLL C# gérée ?

Patricia Arquette
Libérer: 2024-12-29 07:44:09
original
422 Les gens l'ont consulté

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

Intégrer des DLL non gérées dans des DLL C# gérées

L'intégration de DLL non gérées dans des DLL gérées est une technique utile pour consolider et protéger les dépendances. Cependant, cela peut être difficile à réaliser.

Problème :

Lorsque vous tentez d'intégrer une DLL non gérée dans une DLL gérée à l'aide de DllImport, vous rencontrez une erreur d'accès refusé.

Explication :

Pour intégrer une DLL non gérée en tant que ressource, vous devez prendre des mesures supplémentaires au-delà de la simple ajout en tant que ressource intégrée dans le projet.

Solution :

Pour intégrer et utiliser avec succès une DLL non gérée dans une DLL gérée :

  1. Extraire et charger le fichier intégré DLL :

    • Extraire la DLL non gérée du flux de ressources intégré vers un répertoire temporaire.
    • Charger explicitement la DLL extraite à l'aide de LoadLibrary avant d'utiliser DllImport.
  2. Utiliser un temporaire unique Répertoire :

    • Créez un répertoire temporaire unique pour chaque version de votre assembly afin d'éviter les conflits de versions.
  3. Gérer le fichier Exceptions de copie :

    • Gérer les exceptions lors de la tentative de copie de la DLL intégrée dans le fichier temporaire répertoire. Vous pourrez peut-être ignorer l'exception si le fichier existe déjà dans le répertoire.

Exemple de code :

Le code suivant L'extrait montre le processus d'intégration :

// Get a unique temporary directory for this assembly version
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 to the temporary location
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(
  "MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
  using (Stream outFile = File.Create(dllPath))
  {
    CopyBytes(stm, outFile);
  }
}

// Load the extracted DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
Copier après la connexion

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!

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