如何解决:自定义MSBuild任务需要在AppBase之外进行组装

时间:2009-03-27 16:21:41

标签: msbuild task assembly-resolution fusion

我有一个自定义任务,我想在构建我的C#项目时执行它。此任务位于MyTask.dll中,该文件引用另一个程序集MyCommon.DLL。

问题是MyCommon.dll位于相对于MyTask.dll的“.. \ Common \ MyCommon.dll”,它将它置于AppBase目录之外,用于MSBuild进程。我已经通过分析MSBuild的日志并看到Fusion关于绑定失败的报告确认这确实是问题。

如何让Fusion在构建过程中找到MyCommon.dll?请注意,移动程序集会破坏我的应用程序,这也取决于它。

更新:嗯,似乎我会继续使用副本。其他解决方案都需要系统范围的修改,这在这里并不是真的有必要。

4 个答案:

答案 0 :(得分:2)

那么复制它呢?只是一个想法。在那里有一个副本只是为了支持你完成后删除的构建。

答案 1 :(得分:1)

我看到多种解决方案:

1st:在GAC中添加程序集(程序集必须具有强名称)

gacutil /I <assembly name> 

第二名:在Codebases or Probing文件或msbuild.exe.config中通过machine.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名将程序集复制到同一目录中,之后将其删除,就像David M所说的那样。

答案 2 :(得分:0)

一个选项是使用ILMerge将依赖项合并到任务程序集中。

答案 3 :(得分:-1)

所有这些“解决方案”都会产生更多依赖性,从而使环境变得复杂。应该有一种更简单的方法来在运行时更新探测路径。

具体来说,MSBuild应该允许您在.proj文件中添加探测路径,或者指定依赖的dll

您可以定义自定义UsingTask:

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

但你不能添加依赖项?它应该被包含在......这里有类似

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

但是,不支持这个......