MsBuild在良好目录中找不到自定义任务';s的二级依赖项

MsBuild在良好目录中找不到自定义任务';s的二级依赖项,msbuild,dependencies,msbuild-task,assembly-resolution,probing,Msbuild,Dependencies,Msbuild Task,Assembly Resolution,Probing,我编写了一个MsBuild任务:MyTask。在我的解决方案中,我有任务项目和其他项目。MyTask引用了一个项目(比如ProjA),该项目引用了第三个程序集(比如dep1和dep2) 这些项目都构建得很好,我将输出放在一个目录(compile)中。在这个目录中,我有我想要的所有dll:MyTask.dll、ProjA.dll、dep1.dll、dep2.dll和其他 在我的MsBuild文件中,我包括自定义任务程序集,其中包含: <UsingTask AssemblyFile="..\C

我编写了一个MsBuild任务:MyTask。在我的解决方案中,我有任务项目和其他项目。MyTask引用了一个项目(比如ProjA),该项目引用了第三个程序集(比如dep1和dep2)

这些项目都构建得很好,我将输出放在一个目录(compile)中。在这个目录中,我有我想要的所有dll:MyTask.dll、ProjA.dll、dep1.dll、dep2.dll和其他

在我的MsBuild文件中,我包括自定义任务程序集,其中包含:

<UsingTask AssemblyFile="..\Compil\MyTask.dll" TaskName="CreateSitesCss" />
如果我将MsBuild.exe复制到我所有dll所在的目录中,它就可以正常工作
MsBuild似乎没有在我的编译目录中查找dep1.dll和dep2.dll,即使它在


编辑

关于如何进行绑定: MyTask通过以下方式引用ProjA项目:

<ProjectReference Include="..\ProjA\ProjA.csproj">
   <Project>{ED61DCC3-D759-4D44-B802-A6A46F328402}</Project>
   <Name>ProjA</Name>
</ProjectReference>

{ED61DCC3-D759-4D44-B802-A6A46F328402}
普罗贾
ProjA通过

<Reference Include="dep1, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\Dependencies\dep1\dep1.dll</HintPath>
</Reference>
<Reference Include="dep2, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\Dependencies\dep2\dep2.dll</HintPath>
</Reference>

假的
..\Dependencies\dep1\dep1.dll
假的
..\Dependencies\dep2\dep2.dll

您可以尝试Fusion日志查看器(fuslogvw.exe,与VisualStudio一起安装),以查看正在搜索程序集的路径。您可以找到另一个可以替代的文件夹

如果dep1和dep2是第三方程序集或不会更改的内部程序集,则可以将它们扔到GAC中。这是我通常在构建服务器上避免的事情,但是如果您只是将它们用于构建帮助程序而不是生产安装,那么这不应该是一个问题


编辑:这可能是原因。您正在使用Assembly.Load来使用ProjA吗?从您提供的日志来看,它似乎无法加载ProjA—甚至无法尝试加载dep1或dep2。

我可以建议一些解决方法

  • 这将允许您将多个程序集合并到一个程序集中

  • 即使未使用辅助参照,也可以将其添加到解决方案中,这会将其复制到bin文件夹中

  • 创建另一个要在编译后运行的目标,以将缺少的程序集复制到文件夹中

  • 希望这有帮助


    Iain

    可能与Nope重复。我看过你链接的主题。在这种情况下,msbuild无法加载任务程序集,因为路径不正确。在我的例子中,任务的负载很好,第一个依赖项(ProjA)也很好,但是第二个级别的依赖项(dep1和dep2)没有。你有没有找到解决这个问题的正确方法?我想我现在也有同样的问题,我也有同样的问题。可能有一种方法可以指定msbuild.exe应在其中查找自定义任务的引用程序集的文件夹。我将尝试使用Fusion日志查看器,这将提供比microsoft.csharp.targets中的注释更具体的结果。至于GAC,dep1和dep2是我们正在进行的项目,因此DLL会发生变化。这就是为什么我喜欢手动将它们复制到msbuilddir,然后删除它们…感谢您的帮助。我用我的绑定配置编辑了我的帖子。我不按代码加载程序集,只按配置加载。我认为日志似乎无法完全加载ProjA(实际上是dep1和dep2依赖项),这与MSBUild错误消息一致:“无法加载文件或程序集'dep1,Version=2.0.0.0,Culture=neutral,PublicKey Token=9109c11469ae1bc7'”我给你佩德罗奖励,因为你帮了我最大的忙,但我仍然没有回答:'(.谢谢,佩德罗。你有显示此问题的示例(带代码)吗?如果我能得到副本,我可能可以帮助调试。我知道ILMerge,它可以解决问题。但我只在最后一个选项中使用它(我甚至可能更喜欢将MSBuild.exe复制到目录).至于选项2和3:文件位于输出文件夹中,它们被标记为私有(VS中的copylocal)一切都很好。我在C#dll项目中做了几次,没有造成任何伤害。但是在MSBuild自定义任务中,MSBuild似乎没有在当前目录中查找第二级程序集……您在这方面取得过任何进展吗?我在近7年后遇到了同样的问题!()。我也要尝试ILMerge。我正在使用VS2015和Msbuild 14.0。
    <Reference Include="dep1, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Dependencies\dep1\dep1.dll</HintPath>
    </Reference>
    <Reference Include="dep2, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Dependencies\dep2\dep2.dll</HintPath>
    </Reference>