Comment puis-je faire référence correctement à une dll C # que je n'ai pas d'accès physique à? (J'ai effectivement la DLL, tout comme toutes les dépendances.) P>
arrière-plan: p>
sur l'ordinateur cible, il existe un programme et de nombreux fichiers DLL interdépendants installés dans Je dois écrire une application simple qui sera déployée sur l'ordinateur cible vers Ce programme simple devra apporter quelques appels dans l'un des fichiers DLL sous sur ma machine de développement, je suis pas em> avoir une copie de Quelle est la méthode correcte pour utiliser et référencer cette DLL dans mon projet Visual Studio de telle sorte que mon merci p> C: \ FancyProgram code>. P>
C: \ SimpleProgram code>. p>
c: \ fancyprogram code>. C'est une DLL gérée .NET P>
FancyProgramme code>. J'ai ce fichier dll, mais je n'ai aucune de ses dépendances. Je ne peux pas non plus regrouper cette DLL dans
simpleProgram code>. P>
simpleProgram code> compilera correctement mais chargera la DLL au moment de l'exécution du bon emplacement? P>
4 Réponses :
euhhhh, qu'est-ce que tu vas faire pour le tester? En supposant que vous avez compris que vous avez compris que vous devez vous assurer que le .dll est dans le GAC et le référencer ainsi (idéalement) ou em> le .dll doit être au même endroit sur tous les ordinateurs . Ajoutez le fichier .dll dans vos références et marquez-la sous la copie locale: FALSE, vous ne le déployez pas. Bonne chance. P>
Les tests seront effectués sur une machine cible. (C'est juste une petite partie du code). La DLL sera dans l'emplacement précis sur toutes les machines cible. Comment puis-je dire à mon programme de le charger au moment de l'exécution d'un emplacement spécifique?
Sachant que j'irais avec la suggestion de Zihotki.
Ma recommandation est de créer une façade pour la fonctionnalité que vous souhaitez utiliser à partir de cette DLL. Et n'utilisez pas (référence) cela directement - résolvez-le et chargez-le de manière dynamique:
C # - Correction de la bonne voie à charger l'assemblage, Trouvez la méthode de la classe et de l'appel ()
Assemblage de charge au moment de l'exécution et créer une instance de classe P>
Vous voudrez peut-être examiner les détails de Je construirais également la DLL pour tester localement, avec la même interface que votre DLL externe. La quantité de fonctionnalité yo yo dépend de la complexité de l'interface et de votre Il y avait d'excellentes réponses à mon ancien Question à propos de l'importation de DLL externes. P> loadlibrary code>,
getProcAddress code> et
marshal.getdelegatefuncoincer code>. p>
simpleProgram code>. P>
.NET fera de toute façon la liaison tardive. Tant que vous ne référez pas le fichier .dll de quelque manière que ce soit avant de vouloir le charger, cela fonctionnera.
Encapsumez simplement toutes les références (champs, propriétés, méthodes, instances) dans une classe ou un projet de Spearate et effectuez une instance uniquement lorsque vous devez. Vous pouvez ensuite essayer l'erreur de chargement. Voir la fenêtre Visual Studio Sortie Lorsque votre application est exécutée, elle vous indiquera que c'est tenter de charger ce que .dll. P>
Vous pouvez également vouloir regarder ces événements pour rendre vos erreurs de poignée d'application gracieusement:
AppDomain.CurrentDomain.AssemblyLoad += ...; AppDomain.CurrentDomain.AssemblyResolve += ...; AppDomain.CurrentDomain.UnhandledException += ...; AppDomain.CurrentDomain.FirstChanceException += ...;
Géré (.NET) ou dll non géré?
Géré. (mis à jour. Merci.)
Du point de vue correct posera également un problème dans le cas géré car de C: \ SmpleProgram aucune DLL sera chargée de C: \ FancyProgramme. Ou les dépendances sont-elles gac-ed? N'ayé jamais essayé si un lien symbolique fera l'affaire (oui: weblogs.asp.net/israelio/archive/2011/01/10/... )
Je n'ai aucune idée de la façon dont le programme de fantaisie gère sa propre dll chargement.
Si vous devez effectuer des appels dans l'un des fichiers DLL, vous devrez le faire référence, je suppose que ce programme simple est également C #, il n'y a aucun moyen de cela. Vous devez obtenir la DLL dont vous avez besoin d'un programme de fantaisie Tout ce que vous avez à faire est de copier et de coller. Si la DLL en question a été écrite la bonne façon que cela ne dépend de rien d'autre, si cela n'a pas été écrit correctement, vous n'avez évidemment aucun choix dans la matière. Votre question n'a aucun sens, comment pouvez-vous vous attendre à utiliser une DLL que vous ne pouvez pas regrouper avec le programme qui utilisera un fichier DLL?