2009-03-27 5 views
5

J'ai une tâche personnalisée que je veux exécuter lors de la construction de mes projets C#. Cette tâche se trouve dans MyTask.dll, qui référence un autre assembly, MyCommon.DLL.Comment résoudre: La tâche MSBuild personnalisée nécessite un assemblage en dehors d'AppBase

Le problème est que MyCommon.dll est situé à ".. \ Common \ MyCommon.dll" relatif à MyTask.dll, ce qui le place en dehors du répertoire AppBase pour le processus MSBuild. J'ai confirmé que c'est effectivement le problème en analysant le journal de MSBuild et en voyant le rapport de Fusion sur l'échec de liaison.

Que puis-je faire pour que Fusion trouve MyCommon.dll pendant le processus de construction? Notez que le déplacement de l'assembly casserait mon application, qui en dépend également.

MISE À JOUR: Eh bien, il semble que je vais utiliser une copie afterall. D'autres solutions nécessitent toutes des modifications à l'échelle du système, ce qui n'est pas vraiment justifié ici.

Répondre

2

Donc le copier à la place? Juste une pensée. Avoir une copie là juste pour soutenir la construction que vous supprimez une fois que vous avez terminé avec elle.

+0

Oui, j'épargne cela pour l'utiliser comme tout dernier recours. Il se sent maladroit et j'espère qu'il y a un meilleur moyen. :) – aoven

+0

D'accord. Mais je ne peux penser à rien. Nous verrons ce que les autres ont proposé. –

1

Je vois plusieurs solutions:

1er: Ajouter l'assemblage dans le GAC (votre assemblée doit avoir un nom fort)

gacutil /I <assembly name> 

2: Situer l'ensemble à travers Codebases or Probing, en votre fichier machine.config ou au msbuild.exe.config.

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="MyCommon" 
           publicKeyToken="32ab4ba45e0a69a1" 
           culture="neutral" /> 
      <codeBase version="2.0.0.0" 
         href="file://C:/yourpath/MyCommon.DLL"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

3: copie l'ensemble dans le même répertoire avant et après le supprimer, comme David M dit.

-1

Toutes ces "solutions" créent plus de dépendances qui compliquent l'environnement. Il devrait y avoir un moyen plus facile de mettre à jour le chemin de sondage lors de l'exécution ..

Plus précisément MSBuild devrait vous permettre d'ajouter des chemins de sondage dans votre fichier .proj, ou de préciser les dll dépendants

Vous pouvez définir une coutume UsingTask :

<UsingTask TaskName="Task" AssemblyFile="Assembly.dll" />

mais vous ne pouvez pas ajouter des dépendances? il devrait être inclus ... ici avec quelque chose comme

<UsingTask TaskName="Task" AssemblyFile="Assembly.dll"> 
<DependantAssembly AssemblyFile="dependant.dll"/> 
</UsingTask> 

Mais, ce n'est pas pris en charge ...

0

Une option est d'utiliser ILMerge pour fusionner la dépendance dans l'ensemble des tâches.

Questions connexes