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.

21
demandé sur Jeff 2012-11-25 10:30:12

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>
25
répondu Jeff 2012-11-25 08:44:09

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"/>
0
répondu Bernd 2015-03-16 13:02:14