MSBuild的UsingTask解析引用(MSBuild UsingTask Resolve Re

2019-07-04 02:21发布

我觉得像我以前固定的,但我不记得如何。

我有一个任务文件看起来像这样(CustomTasks.tasks):

<UsingTask AssemblyFile="CustomTasks.dll" TaskName="MyCustomTask"/>

它引用的组件(即Ionic.Zip.dll)。 Ionic.Zip.dll是不是在GAC(我不希望它是)。 它位于旁边的我CustomTasks.dll。

我有一个名为从具有CustomTasks.tasks,CustomTasks.dll和Ionic.Zip.dll在它我的SLN文件的MSBuild的上一级目录。

我有一个的csproj引用任务文件并调用自定义任务:

<Import Project="$(ProjectDir)\..\MSBuild\CustomTasks.tasks" />

<MyCustomTask ..... />

在构建时,这产生了:

该“MyCustomTask”任务无法从组件加载.... MyCustomTasks.dll。 无法加载文件或程序集“Ionic.Zip,......”或它的一个依赖。

Answer 1:

厌倦和沮丧,并采取了直接的方法......我不认为这是同样的方式我以前解决了这个问题...但也许这将帮助别人。 其他的,更优雅的解决方案更受欢迎。

  <Target Name="BeforeBeforeBuild" BeforeTargets="BeforeBuild">
    <HandleAssemblyResolve SearchPath="$(ProjectDir)\..\MSBuild\" />
  </Target>
  <UsingTask TaskName="HandleAssemblyResolve" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <SearchPath ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System" />
      <Using Namespace="System.IO" />
      <Using Namespace="System.Reflection" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => 
{ 
  var assemblySearchPath = Path.Combine(SearchPath, e.Name.Split(',')[0]);
  if (File.Exists(assemblySearchPath)) return Assembly.LoadFrom(assemblySearchPath);

  return null;
};
]]>
      </Code>
    </Task>
  </UsingTask>


Answer 2:

这其实很容易解决。 把你的自定义生成任务和依赖关系在不同的文件夹中。 那么依赖被正确加载。

例如像这样:

<UsingTask AssemblyFile="..\BuildTools\CustomTasks.dll" TaskName="MyCustomTask"/>


文章来源: MSBuild UsingTask Resolve References