【问题标题】:MSBuild UsingTask Resolve ReferencesMSBuild UsingTask Resolve References
【发布时间】:2012-11-12 23:39:08
【问题描述】:

我觉得我以前解决过这个问题,但我不记得是如何解决的。

我有一个如下所示的任务文件 (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 ..... />

在构建时,这会产生:

无法从程序集 ....MyCustomTasks.dll 加载“MyCustomTask”任务。无法加载文件或程序集“Ionic.Zip,......”或其依赖项之一。

【问题讨论】:

    标签: msbuild msbuild-task


    【解决方案1】:

    感到疲倦和沮丧并采取了直接的方法...我认为这与我之前解决问题的方式不同...但也许这会对其他人有所帮助。其他更优雅的解决方案非常受欢迎。

      <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>
    

    【讨论】:

    • 嘿 - 我正要写这个确切的代码(或类似的东西),然后决定通过 SO 寻找解决问题的其他方法......谢谢,这最终非常有用!
    • 这个 msbuild 引用问题确实使连续集成成为一个痛苦......
    • @JerKimball,我正在寻找类似的方法,你能解释一下这里的搜索路径吗?
    • 感谢您的解决方案。我只需要在第一行代码中添加一个 + ".dll"。
    【解决方案2】:

    这实际上很容易解决。将您的自定义构建任务和依赖项放在不同的文件夹中。然后正确加载依赖项。

    比如这样:

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

    【讨论】:

    • 这不起作用。只有程序集文件本身被正确加载。不会找到程序集的任何依赖项,即使它们位于同一文件夹中。至少,这是我对 msbuild 和这种方法的经验。
    • 也许你应该试一试 - 它适用于我的 MSBuild 4,这就是我在这里留下评论的原因。
    • 我想我应该在我的陈述中不那么明确,而不是说“这不起作用”,但也许你应该花点时间阅读 cmets。我说“这是我对 msbuild 和这种方法的体验”,这当然意味着我尝试过。我怀疑其他东西帮助了你的构建,而不是你相信的,但我不知道你的配置或环境,所以我不知道它是什么。将程序集放在同一个文件夹中并不能达到预期的效果,因为 Fusion 程序集加载器不会在那里查找它们。幸运的是,所选解决方案是一个可行的解决方案。
    • 坦率地说,我希望这对我有用。它会在程序集加载部分显示一些智能。
    • 我已经在本地取得了成功,但是当我在 AppVeyor 上运行它时它失败了。我的任务程序集在与其自身相同的文件夹中有一个外部依赖项,但由于某种原因,MSBuild 并没有一直拾取它。
    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 2017-07-12
    • 1970-01-01
    • 2023-03-16
    • 2018-04-12
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多