我觉得我之前已经修好了,但我记不起来了。
我有一个看起来像这样的任务文件(CustomTasks.tasks):
<UsingTask AssemblyFile="CustomTasks.dll" TaskName="MyCustomTask"/>
它引用一个程序集(即Ionic.Zip.dll)。 Ionic.Zip.dll不在GAC中(我不希望它)。它就在我的CustomTasks.dll旁边。
我的sln文件中有一个名为MSBuild的目录,其中包含CustomTasks.tasks,CustomTasks.dll和Ionic.Zip.dll。
我有一个引用任务文件的csproj并调用自定义任务:
<Import Project="$(ProjectDir)\..\MSBuild\CustomTasks.tasks" />
<MyCustomTask ..... />
在构建时,这会产生:
无法从程序集加载“MyCustomTask”任务.... MyCustomTasks.dll。无法加载文件或程序集“Ionic.Zip,......”或其中一个依赖项。
答案 0 :(得分: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>
答案 1 :(得分:1)
这实际上很容易解决。将自定义生成任务和依赖项放在不同的文件夹中。然后正确加载依赖项。
例如:
<UsingTask AssemblyFile="..\BuildTools\CustomTasks.dll" TaskName="MyCustomTask"/>