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>
タグを使用できないことを示しているため、同じ動作を近似する別の方法を探しています。
親ディレクトリがツリーのどこかで異なることが保証されている私の場合、うまく機能するハッキングソリューションを見つけました。
<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>
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>
複数の条件が一致する場合、最後の条件が使用されます。
次のように、一般プロパティグループにセカンダリパスを追加します。 csprojファイル内
<PropertyGroup>
<ReferencePath>..\..\..\..\..\foo\sdk\csharp\bin\</ReferencePath>
...
</PropertyGroup>
ReferencePath
プロパティは、MsBuildの実行時に指定することを目的としていますが、このように正常に機能します。
私はこのソリューションを問題なく使用しています:
<Reference Include="log4net">
<HintPath>
$(SolutionDir)packages\log4net.2.0.8\lib\net45-full\log4net.dll
</HintPath>
</Reference>
ここから得た: LeonidVasilyevからのヒントパス相対回答を使用
/csharp/bin
フォルダ(ドライブごとに異なる)、たとえばX:
そして次に参照X:\
またはX:\bin
両方のマシンで、パスが同じになります。