MSBuild UsingTask解析引用

Jef*_*eff 22 msbuild msbuild-task

我觉得我以前修过这个,但我记不起来了.

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

<UsingTask AssemblyFile="CustomTasks.dll" TaskName="MyCustomTask"/>
Run Code Online (Sandbox Code Playgroud)

它引用了一个程序集(即Ionic.Zip.dll).Ionic.Zip.dll不在GAC中(我不希望它).它就在我的CustomTasks.dll旁边.

我有一个名为MSBuild的目录,从我的sln文件向上一级,其中包含CustomTasks.tasks,CustomTasks.dll和Ionic.Zip.dll.

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

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

<MyCustomTask ..... />
Run Code Online (Sandbox Code Playgroud)

在构建时,这会产生:

无法从程序集加载"MyCustomTask"任务.... MyCustomTasks.dll.无法加载文件或程序集'Ionic.Zip,......'或其依赖项之一.

Jef*_*eff 25

感到疲惫和沮丧并采取了直接的方法...我不认为这与我之前解决问题的方式相同......但也许这会帮助别人.其他更优雅的解决方案非常受欢迎.

  <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>
Run Code Online (Sandbox Code Playgroud)

  • 引用的这个msbuild问题确实使得连续集成成为... (7认同)