2009-03-27 21 views
5

Tengo una Tarea personalizada que quiero ejecutar al construir mis proyectos de C#. Esta tarea se encuentra en MyTask.dll, que hace referencia a otro ensamblado, MyCommon.DLL.Cómo solucionar: tarea de MSBuild personalizada que requiere ensamblaje fuera de AppBase

El problema es que MyCommon.dll se encuentra en ".. \ Common \ MyCommon.dll" relativo a MyTask.dll, que lo coloca fuera del directorio de AppBase para el proceso de MSBuild. Confirmé que este es realmente el problema al analizar el registro de MSBuild y ver el informe de Fusion sobre la falla de enlace.

¿Qué puedo hacer para que Fusion encuentre MyCommon.dll durante el proceso de compilación? Tenga en cuenta que mover el conjunto rompería mi aplicación, que también depende de ella.

ACTUALIZACIÓN: Bueno, parece que iré con una copia después de todo. Otras soluciones requieren modificaciones en todo el sistema, lo que no está garantizado aquí.

Respuesta

2

¿Copiarlo en su lugar? Solo un pensamiento. Tenga una copia allí solo para respaldar la construcción que borre una vez que haya terminado con ella.

+0

Sí, estoy guardando eso para usarlo como último recurso. Se siente torpe y espero que haya una mejor manera. :) – aoven

+0

De acuerdo. Pero ninguno puedo pensar tristemente. Veremos qué se les ocurre a los demás. –

1

aparecen varias soluciones:

1ª: agregar el ensamblado en el GAC (el ensamblado debe tener un nombre fuerte)

gacutil /I <assembly name> 

segundo: localizar el conjunto a través Codebases or Probing, en su archivo machine.config o en 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> 

tercera: copiar el ensamblaje en el mismo directorio antes y después de eliminar, como David M dijo.

-1

Todas estas "soluciones" crean más dependencias que complican el entorno. Debe haber una manera más fácil de actualizar la trayectoria de sondeo en tiempo de ejecución ..

Específicamente MSBuild debería permitirle agregar caminos de sondeo en su archivo .proj, o para especificar los archivos DLL dependientes

Puede definir una costumbre UsingTask :

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

pero usted no puede agregar dependencias? debe incluirse aquí ... con algo como

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

Pero, no esto no es compatible ...

0

Una opción es utilizar ILMerge fusionar la dependencia en el conjunto de tareas.

Cuestiones relacionadas