web-dev-qa-db-ja.com

.csprojアセンブリの複数のヒントパス

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/and../../../../foo/sdk/csharp/bin/ for Assembly.dll

C++では、依存関係のパスをスタンドアロンのプロパティシートに入れ、SDKで別のバージョンを配布しました。しかし、C#にはプロパティシートがなく、完全なプロジェクトの2つのバージョンを維持する必要はありません。

この質問 を見ましたが、これは複数の<HintPath>タグを使用できないことを示しているため、同じ動作を近似する別の方法を探しています。

61
japreiss

親ディレクトリがツリーのどこかで異なることが保証されている私の場合、うまく機能するハッキングソリューションを見つけました。

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

HintPathは1つしか使用できないため、最も簡単な方法は、次のようにすべてに非常に適した条件属性を使用することです。

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

複数の条件が一致する場合、最後の条件が使用されます。

81
Wolf5

次のように、一般プロパティグループにセカンダリパスを追加します。 csprojファイル内

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

ReferencePathプロパティは、MsBuildの実行時に指定することを目的としていますが、このように正常に機能します。

6
Filip De Vos

私はこのソリューションを問題なく使用しています:

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

ここから得た: LeonidVasilyevからのヒントパス相対回答を使用

2
JReis

/csharp/binフォルダ(ドライブごとに異なる)、たとえばX:そして次に参照X:\またはX:\bin両方のマシンで、パスが同じになります。

0
Axarydax