23

以前にこれを修正したような気がしますが、方法を思い出せません。

次のようなタスク ファイルがあります (CustomTasks.tasks):

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

アセンブリ (つまり、Ionic.Zip.dll) を参照します。Ionic.Zip.dll は GAC に含まれていません (私は GAC には入れたくありません)。CustomTasks.dll のすぐ隣にあります。

CustomTasks.tasks、CustomTasks.dll、および Ionic.Zip.dll を含む sln ファイルから 1 レベル上の MSBuild というディレクトリがあります。

タスク ファイルを参照し、カスタム タスクを呼び出す csproj があります。

<Import Project="$(ProjectDir)\..\MSBuild\CustomTasks.tasks" />

<MyCustomTask ..... />

ビルド時に、これにより次の結果が得られます。

"MyCustomTask" タスクをアセンブリから読み込めませんでした ....MyCustomTasks.dll。ファイルまたはアセンブリ 'Ionic.Zip,......' またはその依存関係の 1 つを読み込めませんでした。

4

2 に答える 2

28

疲れて欲求不満になり、直接的なアプローチを取りました...これは以前に問題を解決した方法と同じではないと思います...しかし、これは他の誰かを助けるかもしれません。他のよりエレガントなソリューションは大歓迎です。

  <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>
于 2012-11-25T07:07:08.407 に答える