2010-01-05 8 views
7

J'ai un projet de bibliothèque de classes que j'ai fait. Appelons-le ClassA. En ClassA j'ai besoin d'accéder à certains outils qui résident dans dll (ToolsDLL.dll).Pouvez-vous regrouper des DLL ensemble?

Dans ClassA j'ai ajouté ToolsDLL.dll au projet et sélectionné le fichier ToolsDLL.dll pour copier dans le répertoire de sortie TOUJOURS. Donc, cette bibliothèque construit et compile juste bien et dans le répertoire de sortie je vois ClassA.dll avec ToolsDLL.dll

Ensuite, je veux écrire une application, disons App_A qui utilise les méthodes de ClassA. Ainsi, dans mon projet App_A, j'ai ajouté une référence à ClassA.dll afin que je puisse accéder à son espace de noms. Tout est bien et bon, ça construit/compile. Le problème est dès que j'exécute App_A et il arrive à un point où ToolsDLL.dll doit être utilisé, il lève une exception "Impossible de charger ToolsDLL.dll Je ne comprends pas comment il est possible qu'il Je ne trouve pas cette DLL car il se trouve dans le même répertoire que ClassA.dll

J'ai trouvé que si je mets ToolsDLL.dll dans le répertoire de sortie de App_A cela fonctionne très bien. De toute façon, ToolsDll.dll peut être en quelque sorte livré avec ClassA.dll, car mes clients vont écrire leurs propres applications similaires à AppA et ce serait bien s'ils devaient seulement référencer un fichier dans leur projet et non plusieurs

Répondre

12

Il existe un outil de Microsoft appelé ILMerge. Il fera probablement ce que vous voulez, regroupant plusieurs assemblées en un seul fichier.

P.S.: Une autre solution relativement fréquente à votre problème consiste à ajouter un événement post-build à la solution/au projet de votre application qui copie le ToolsDLL.dll requis dans le répertoire de sortie? Quelque chose le long de la ligne de:

xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll 

(. Désolé si je reçois une partie de ce mal, je tape ce de ma mémoire)

Bien sûr, votre client devrait également le faire. Mais encore une fois, ils l'ont probablement déjà fait.

+0

Il semble que ILMerge ne peut être utilisé que sur un assemblage .Net. Est-ce exact. Dans mon cas, ToolsDLL.dll m'a été fourni par une fabrication de puces. Je ne sais pas s'il s'agit d'un assemblage .net ou non. Est-ce que ça compte? – PICyourBrain

+0

Oui, je crois que cela ne fonctionne que pour les assemblages .NET. Afin de comprendre quel genre de '.dll' vous avez, peut-être pourriez-vous utiliser le.Utilitaire NET SDK 'ildasm', pour essayer de désassembler' .dll'. S'il s'agit d'un assemblage .NET, cela devrait fonctionner; s'il contient du code natif, 'ildasm' devrait échouer. – stakx

+0

J'ai remarqué dans Visual Studio si je vais dans ToolsDll.dll -> Properties il y a une propriété appelée Action. Puis-je simplement définir ceci sur Embedded Resource? – PICyourBrain

1

Avez-vous ajouté la DLL au projet, ou y avez-vous ajouté une référence? Vous devriez faire le dernier, alors ce genre de chose est pris en charge automatiquement pour vous. Il semble que vous ayez ajouté le fichier réel aux fichiers du projet et que vous l'ayez configuré pour copier.

Si vous ne voulez certainement une approche de fichier unique, puis accepter les suggestions des autres de ILMerge évidemment ...

0

Vous pouvez utiliser un outil de fusion IL, ou installer ToolsDLL.dll dans le GAC.

Aussi si vous regardez la sortie de App_A, ClassA.dll est déjà là, c'est là qu'il cherche ToolsDLL.dll.

Questions connexes