72

我正在为 SDK 分发打包示例代码。在发行版中,从代码到 SDK 程序集的相对路径与构建机器不同。例如:

分配

csharp/bin/assembly.dll
example/ex1/ex1.csproj

建造机器

foo/sdk/csharp/bin/assembly.dll
bar/baz/quux/ex1/ex1.csproj

假设我不能移动任何东西。有没有办法我可以指示ex1.csproj查看两者

../../csharp/bin/ ../../../../foo/sdk/csharp/bin/对于assembly.dll

在 C++ 中,我会将依赖路径放在独立的属性表中,并使用 SDK 分发不同的版本。但是 C# 没有属性表,我不想维护完整项目的两个版本。

我已经看到这个问题指出我不能使用多个<HintPath>标签,所以我正在寻找另一种方法来近似相同的行为。

4

6 回答 6

116

由于只能使用 ONE HintPath,因此最简单的方法是使用非常棒的 Condition 属性,如下所示:

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

所以这个问题的答案是这样的:

<Reference Include="assembly">
    <HintPath Condition="Exists('..\..\csharp\bin')">..\..\csharp\bin\assembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\foo\sdk\csharp\bin')">..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath>
</Reference>

如果多个条件匹配,将使用最后一个。

于 2014-11-04T14:59:04.440 回答
22

我找到了一个适用于我的案例的 hacky 解决方案,其中父目录保证在树上的某处不同:

<Choose>
  <When Condition="Exists('$(MSBuildProjectDirectory)\..\..\example')">
    <ItemGroup>
      <Reference Include="Assembly ...">
        <HintPath>..\..\csharp\bin\assembly.dll</HintPath>
      </Reference>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <Reference Include="Assembly ...">
         <HintPath>..\..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath>
      </Reference>
    </ItemGroup>
  </Otherwise>
</Choose>
于 2013-03-27T19:23:45.993 回答
6

将如下所示的辅助路径添加到常规属性组。在 csproj 文件中

<PropertyGroup>
    <ReferencePath>..\..\..\..\..\foo\sdk\csharp\bin\</ReferencePath>
    ...
</PropertyGroup>

ReferencePath属性旨在在执行 MsBuild 时指定,但它会像这样正常工作。

于 2013-03-27T20:29:13.890 回答
5

我正在使用这个解决方案没有任何问题:

<Reference Include="log4net">
  <HintPath>
     $(SolutionDir)packages\log4net.2.0.8\lib\net45-full\log4net.dll
  </HintPath>
</Reference>

从这里得到它: 使用来自 LeonidVasilyev 的提示路径相对答案

于 2018-02-14T15:46:00.150 回答
0

例如,您可以将/csharp/bin文件夹替换为驱动器(在每台机器上不同),X:然后在两台机器上引用X:\或引用X:\bin,因为路径现在相同。

于 2013-03-27T18:30:19.420 回答
-2

只需将 DLL 的构建服务器位置添加为项目的参考路径。似乎做得很好,而且非常简单。仅当您知道 DLL 的构建服务器的文件夹时才有效。

在此处输入图像描述

于 2013-05-22T16:13:07.247 回答