【问题标题】:MSBuild can't use absolute path DLLs?MSBuild 不能使用绝对路径 DLL?
【发布时间】:2017-11-07 03:36:14
【问题描述】:

MSBuild 告诉我它找不到包含在以下任务中的引用(这是一个内联任务):

<Task>
  <Reference Include="WindowsBase" />
  <Reference Include="$(SolutionDir)ImageTextWriter\bin\$(Configuration)\ImageTextWriter.dll" />
  ...
</Task>

我已确认此文件确实存在于指定路径。然而 MSBuild 返回了

System.IO.FileNotFoundException: 无法加载文件或程序集 'ImageTextWriter, Version=...

我是不是做错了什么?

注意:我不是 MSBuild 专业人士,但 this post 告诉我硬编码路径应该可以工作。

【问题讨论】:

  • 尝试打印出您正在使用的扩展版路径。路径可能与您的预期不同。如果不是,那么引用的二进制文件的版本或 .net 版本可能存在问题
  • 如果您从宏中获得未定义路径,this 帖子可能会有用。
  • @Jan:我打印了那条路径,似乎没问题。 DLL 使用的是 .NET 4.5,但解决方案中的所有其他项目也都在使用它。
  • 构建规则可能检查得太早,MSBuild 会尝试跳过不必要的工作。使用 /verbose 选项可以详细跟踪它检查的内容。考虑通过解释为什么你认为你需要自己写这个来得到一个真正对你有帮助的答案。
  • @HansPassant:我通读了 MSBuild 输出。看起来它成功构建了ImageTextWriter 并将其复制到bin 目录。因此,它开始处理我的内联任务,但无法再找到ImageTextWriter 程序集。这两个步骤在输出中彼此相邻列出;中间没有任何东西可以怀疑 DLL 可能已被删除。

标签: c# msbuild


【解决方案1】:

我想知道强大的程序集命名是否是罪魁祸首。换个试试

<Reference Include="$(SolutionDir)ImageTextWriter\bin\$(Configuration)\ImageTextWriter.dll" />

<Reference Include="$(SolutionDir)ImageTextWriter\bin\$(Configuration)\ImageTextWriter.dll">
    <SpecificVersion>False</SpecificVersion>
</Reference>

如果失败,请重新考虑在构建早期从 bin/ 清除 ImageTextWriter.dll 的可能性(尽管您之前对详细日志输出的检查似乎排除了这种可能性):

  1. 手动将ImageTextWriter.dll 复制到项目外的任意文件夹中。
  2. 暂时将 Include 路径更改为该文件副本的完整硬编码路径。
  3. 点击你的脚后跟三下...

编辑

我做了一些测试,发现:

  • Reference 元素位于Task 中时,不允许使用SpecificVersion 元数据。以上就是我的第一个想法!
  • 但是,在使用 $(SolutionDir)$(Configuration) 的上下文中,属性扩展需要将 &lt;Task&gt; 更改为 &lt;Task Evaluate="True"&gt;

    • 这是我用来验证行为的构造:
      
      <PropertyGroup>
          <pathfoo>C:\some\path</pathfoo>
      </PropertyGroup>
      <UsingTask [...]>
          <Task Evaluate="True">
              <Reference Include="$(pathfoo)\some.dll />
              [...]
          </Task>
      </UsingTask>
      
    • 这是引导我尝试它的文档(强调我的):

      UsingTaskBodyType 包含内联任务实现。 内容对 MSBuild 不透明。

      UsingTaskBodyType_Evaluate ... body 是否应该在使用前扩展属性。默认为 false。

【讨论】:

  • 我会在早上检查并回复您。谢谢。
  • @dotNET - 请检查指定&lt;Task Evaluate="True"&gt;(上面的详细信息)是否有效。在我自己的简化测试中这是必要的。
【解决方案2】:

你可以试试那个:

<Reference Include="ImageTextWriter">
  <HintPath>$(SolutionDir)ImageTextWriter\bin\$(Configuration)\ImageTextWriter.dll</HintPath>
</Reference>

但如果这是创建ImageTextWriter.dll 的项目,我认为这是不可能的。

【讨论】:

  • 出于某种原因,MSBuild 不喜欢 HintPath 作为 Reference 文件中 Reference 节点的子节点,尽管我可以看到 .vbproj.csproj 文件确实使用它方法。
  • 你是对的,你不能在这里使用HintPath$(SolutionDir) 中有特殊字符吗?就像你上面链接的帖子一样。
  • 不,我看不到任何特殊字符,甚至看不到空格。名称超过 8 个字符,但这应该不是问题。我的直觉是这与汇编版本有关。我手动将库的输出DLL作为标准项复制到我的主项目中,并将上面的路径更改为$(ProjectDir)ImageTextWriter.dll,但还是找不到,说找不到ImageTextWriter Version 1.0.0.0。跨度>
  • 如果您将Include 设置为绝对路径,例如Include="C:\temp\ImageTextWriter\bin\Release\ImageTextWriter.dll"还有错误吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多