MSBuild UsingTask Resolve Références
J'ai l'impression d'avoir corrigé cela avant, mais je ne me souviens pas comment.
J'ai un fichier de tâches qui ressemble à ceci (CustomTasks.tâches):
<UsingTask AssemblyFile="CustomTasks.dll" TaskName="MyCustomTask"/>
Il fait référence à un assemblage (à savoir ionique.Zip.DLL). Ionique.Zip.dll n'est pas dans le GAC (et je ne veux pas que ce soit). Il se trouve juste à côté de mes tâches personnalisées.DLL.
J'ai un répertoire appelé MSBuild un niveau supérieur à partir de mon fichier sln qui a des tâches personnalisées.tâches, CustomTasks.dll et ionique.Zip.dll en elle.
J'ai un csproj qui référence le fichier de tâches et appelle la tâche personnalisée:
<Import Project="$(ProjectDir)..MSBuildCustomTasks.tasks" />
<MyCustomTask ..... />
Au moment de la construction, cela donne:
La tâche" MyCustomTask " n'a pas pu être chargée depuis l'assembly ....MyCustomTasks.DLL. Impossible de charger le fichier ou l'assemblage ionique.Zip,......"ou une de ses dépendances.
2 réponses
Fatigué et frustré et a pris une approche directe...Je ne pense pas que ce soit la même façon que j'ai résolu le problème précédemment...mais peut-être que cela aidera quelqu'un d'autre. D'autres solutions plus élégantes sont plus que bienvenues.
<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>
C'est en fait facile à réparer. Placez vos tâches et dépendances de construction personnalisées dans un dossier différent. Ensuite, les dépendances sont chargées correctement.
Par exemple comme ceci:
<UsingTask AssemblyFile="..\BuildTools\CustomTasks.dll" TaskName="MyCustomTask"/>