【问题标题】:HintPath on a added reference in Visual Studio在 Visual Studio 中添加引用的 HintPath
【发布时间】:2010-10-02 12:44:44
【问题描述】:

我知道我可以将 HintPath 添加到外部 DLL 以帮助 Visual Studio/TFS 在构建时找到 dll。

我想知道的是...是否可以添加多个 HintPath

例如...开发人员将他们的 DLL 放在一个地方,而我们在服务器上的不同地方对这些 DLL 进行 GetLatest,因此需要多个 HintPath

世界,你怎么看?

【问题讨论】:

    标签: visual-studio-2008 tfs build-process


    【解决方案1】:

    抱歉,您不能使用多个 HintPath。 Visual Studio/MSBuild 仅采用 last <HintPath> 定义,将忽略任何以前的定义。在 VS2010 和 VS2012 中确认。

    【讨论】:

    • 这个答案应该是被接受的,因为另一个是提供虚假信息。
    • 您可以使用多个 HintPath,每个都有一个条件。在下面检查我的答案。
    • 确认在VS2015中也只使用了最后一个HintPath。
    【解决方案2】:

    此答案不再有效。正如Sardaukar's comment 所说,Visual Studio 总是盲目地使用最后一个 HintPathAlex's answer 支持这个。


    好的。这次我比 Stackoverflow 快。我尝试添加它,它似乎工作正常。

    所以多个 HintPath 是可能的。

    当你有这个时:

    <Reference Include="System.ComponentModel.Composition.Codeplex">
        <HintPath>..\..\..\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
    </Reference>
    

    您可以像这样简单地添加更多提示路径:

    <Reference Include="System.ComponentModel.Composition.Codeplex">
        <HintPath>..\..\..\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
        <HintPath>D:\MEF\System.ComponentModel.Composition.Codeplex.dll</HintPath>
    </Reference>
    

    【讨论】:

    • 您是刚刚添加了多个 HintPath 条目,还是在单个条目中有多个路径?
    • 如果是单项,是逗号分隔还是分号?
    • 你能告诉我们这是怎么可能的吗?
    • (解决提示路径问题时发现此问题,我必须更正上述答案)。你的回答有问题。是的,您可以手动将多个提示路径添加到您的 csproj 文件,但 Visual Studio 将仅使用最后一个提示路径元素。它可能适用于您的情况,因为可以解决您的第二个提示路径。通过交换提示路径来尝试它,以便 d:\MEF\System.ComponentModel.Composition.CodePlex.dll 是第一个。然后编译。您可能会看到 Visual Studio 现在将尝试引用最后一个提示路径。
    • @jon-eric 我很欣赏您尝试做的事情,但只需一个简单的免责声明和方便的链接即可。在这样的大型免责声明中明确呼吁投反对票或投赞成票是一条危险的道路。
    【解决方案3】:

    您可以为此使用环境变量。例如

    <Reference Include="System.ComponentModel.Composition.Codeplex">
        <HintPath>$(PathToDLLs)\MEF2_Preview2\bin\System.ComponentModel.Composition.Codeplex.dll</HintPath>
    </Reference>
    

    【讨论】:

      【解决方案4】:

      使用条件你可以:

      <Reference Include="TheAssembly">
          <HintPath Condition="Exists('..\My\Assembly\Path')">..\My\Assembly\Path\TheAssembly.dll</HintPath>
          <HintPath Condition="Exists('..\..\My\Assembly\Path')">..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
          <HintPath Condition="Exists('..\..\..\My\Assembly\Path')">..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
          <HintPath Condition="Exists('..\..\..\..\My\Assembly\Path')">..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
          <HintPath Condition="Exists('..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
          <HintPath Condition="Exists('..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
          <HintPath Condition="Exists('..\..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
          etc...
      </Reference>
      

      将使用 Condition 计算结果为 true 的最后一个 HintPath。

      【讨论】:

      • 这是否适用于上述关于最后一条提示路径的观察?它是否会忽略具有错误条件的提示路径并采用最后一个具有真值的提示路径?
      • 它忽略除最后一个条件为真的所有内容。
      【解决方案5】:

      将以下内容添加到项目文件底部的注释掉的目标部分之后:

      <Target Name="BeforeResolveReferences">
        <CreateProperty Value="YOUR_FIRST_PATH;YOUR_SECOND_PATH;$(AssemblySearchPaths)">
          <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" />
        </CreateProperty>
      </Target>
      

      YOUR_FIRST_PATHYOUR_SECOND_PATH 替换为您的路径。

      请务必在以下行之后进行,否则您的设置将被覆盖:

      &lt;Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /&gt;

      路径中字符串 DLL 末尾的 $(AssemblySearchPaths) 条目将覆盖正常分辨率。如果将其移至开头,则首先尝试正常分辨率,并检查其他路径是否有任何未找到的路径。正常分辨率包括 &lt;HintPath&gt; 部分,因此如果您的路径在前,则无需删除它们。

      【讨论】:

        猜你喜欢
        • 2010-12-25
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多