J'ai une dll C # gérée qui utilise une dll C ++ non gérée à l'aide de DLLImport. Tout fonctionne très bien. Cependant, je souhaite intégrer cette DLL non gérée dans ma DLL gérée, comme l'explique Microsoft ici:
J'ai donc ajouté le fichier dll non géré à mon projet de dll géré, définissez la propriété sur `` Ressource intégrée '' et modifiez le DLLImport en quelque chose comme:
[DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null",
CallingConvention = CallingConvention.Winapi)]
où 'Wrapper Engine' est le nom d'assembly de ma DLL gérée 'Unmanaged Driver.dll' est la DLL non gérée
Quand je cours, j'obtiens:
L'accès est refusé. (Exception de HRESULT: 0x80070005 (E_ACCESSDENIED))
J'ai vu de MSDN et de http://blogs.msdn.com/suzcook/ que c'est censé être possible ...
Réponses:
Vous pouvez incorporer la DLL non gérée en tant que ressource si vous l'extrayez vous-même dans un répertoire temporaire lors de l'initialisation et la chargez explicitement avec LoadLibrary avant d'utiliser P / Invoke. J'ai utilisé cette technique et cela fonctionne bien. Vous préférerez peut-être simplement le lier à l'assemblage dans un fichier séparé, comme l'a noté Michael, mais le fait de tout avoir dans un seul fichier présente ses avantages. Voici l'approche que j'ai utilisée:
la source
Voici ma solution, qui est une version modifiée de la réponse de JayMcClellan. Enregistrez le fichier ci-dessous dans un fichier class.cs.
la source
Je ne savais pas que c'était possible - je suppose que le CLR doit extraire la DLL native intégrée quelque part (Windows a besoin d'un fichier pour que la DLL la charge - il ne peut pas charger une image à partir de la mémoire brute), et où il essaie de faire que le processus n'a pas la permission.
Quelque chose comme Process Monitor de SysInternals pourrait vous donner un indice si le problème est que la création du fichier DLL échoue ...
Mettre à jour:
Ah ... maintenant que j'ai pu lire l'article de Suzanne Cook (la page ne m'est pas venue auparavant), notez qu'elle ne parle pas d'incorporer la DLL native en tant que ressource dans la DLL gérée, mais plutôt en tant que ressource liée - la DLL native doit toujours être son propre fichier dans le système de fichiers.
Voir http://msdn.microsoft.com/en-us/library/xawyf94k.aspx , où il est dit:
Ce que cela semble faire, c'est ajouter des métadonnées à l'assembly qui font que la DLL native fasse logiquement partie de l'assembly (même s'il s'agit physiquement d'un fichier distinct). Ainsi, des choses comme mettre l'assembly géré dans le GAC incluront automatiquement la DLL native, etc.
la source
Vous pouvez essayer Costura.Fody . La documentation dit qu'il est capable de gérer des fichiers non gérés. Je ne l'ai utilisé que pour les fichiers gérés, et cela fonctionne comme un charme :)
la source
On peut également simplement copier les DLL dans n'importe quel dossier, puis appeler SetDllDirectory dans ce dossier. Aucun appel à LoadLibrary n'est alors nécessaire.
la source