6

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

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

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

更新:好吧,看来我还是会使用副本。其他解决方案都需要在系统范围内进行修改,这在这里并不真正保证。

4

4 回答 4

2

所以改为复制它?只是一个想法。在那里有一个副本,以支持您在完成后删除的构建。

于 2009-03-27T16:23:59.073 回答
1

我看到了多种解决方案:

第一:在 GAC 中添加程序集(您的程序集必须具有强名称)

gacutil /I <assembly name> 

第二:通过代码库或探测,在您的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>

第三:复制之前在同一目录中的程序集并在之后删除它,就像大卫 M 说的那样。

于 2009-03-27T16:52:13.700 回答
0

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

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

您可以定义自定义 UsingTask:

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

但你不能添加依赖项?它应该被包括在内......这里有类似的东西

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

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

于 2009-07-20T20:54:45.813 回答
0

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

于 2012-09-11T05:47:23.907 回答