MSBuild UsingTask Resolve Ссылки
Я чувствую, что исправил это раньше, но не могу вспомнить как.
У меня есть файл задач, который выглядит следующим образом (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,......' или одну из ее зависимостей.
2 ответа
Устал, расстроился и принял прямой подход... Я не думаю, что это то же самое, что я решил проблему ранее... но, возможно, это поможет кому-то еще. Другие, более элегантные решения приветствуются.
<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>
Это на самом деле легко исправить. Поместите ваши пользовательские задачи сборки и зависимости в другую папку. Тогда зависимости загружаются правильно.
Например вот так:
<UsingTask AssemblyFile="..\BuildTools\CustomTasks.dll" TaskName="MyCustomTask"/>