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
372 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!

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