如何解决:自定义MSBuild任务需要位于AppBase之外的程序集。

6
我想在构建C#项目时执行一个自定义任务。这个任务位于MyTask.dll中,引用了另一个程序集MyCommon.dll。
问题在于,相对于MyTask.dll,MyCommon.dll位于".. \ Common \ MyCommon.dll"位置,这将使它超出MSBuild进程的AppBase目录。通过分析MSBuild的日志并查看Fusion关于绑定失败的报告,我确认了这确实是问题所在。
我该怎么做才能让Fusion在构建过程中找到MyCommon.dll?请注意,移动程序集会破坏我的应用程序,因为它也依赖于它。
更新:好吧,看来我最终还是要使用复制。其他解决方案都需要进行系统范围内的修改,而这里并不需要。
4个回答

2
那就复制它,怎么样?只是想法而已。复制一份来支持你的构建,完成后再将其删除。

是的,我把它保存到最后一步使用。它感觉笨重,我希望有更好的方法。 :) - aoven
同意。但是我想不出任何一个,可惜了。我们会看看其他人能想出什么。 - David M

1
我看到了多个解决方案:
第一个:将程序集添加到全局程序集缓存(GAC)中(你的程序集必须有一个强名称)。
gacutil /I <assembly name> 

第二步: 通过Codebases或Probing在您的machine.config文件或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>

第三步:按照David M所说的,在相同目录下复制汇编文件,并在使用后将其删除。


0

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


0
所有这些“解决方案”都会创建更多的依赖项,从而使环境变得更加复杂。应该有一种更简单的方法来在运行时更新探测路径。
具体来说,MSBuild应该允许您在.proj文件中添加探测路径,或指定相关的dll。
您可以定义一个自定义UsingTask: <UsingTask TaskName="Task" AssemblyFile="Assembly.dll" /> 但是您不能添加依赖项?它应该被包含在这里,例如:
<UsingTask TaskName="Task" AssemblyFile="Assembly.dll">
<DependantAssembly AssemblyFile="dependant.dll"/>
</UsingTask>

但是,这并不受支持...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接