Подтвердить что ты не робот

MSBuild UsingTask Resolve References

Мне кажется, что я исправил это раньше, но я не помню, как.

У меня есть файл задач, который выглядит так (CustomTasks.tasks):

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

он ссылается на сборку (а именно 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 ..... />

во время сборки, это дает:

Задача "MyCustomTask" не может быть загружена из сборки... MyCustomTasks.dll. Не удалось загрузить файл или сборку "Ionic.Zip,......" или одну из его зависимостей.

4b9b3361

Ответ 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>

Ответ 2

Это действительно легко исправить. Поместите свои собственные задачи сборки и зависимости в другую папку. Затем зависимости загружаются правильно.

Например, так:

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