0

次のフォルダー構造を持つソリューションにあり、Dependency.dll を参照する C# プロジェクト MyProject.csproj があります。

  • ライブラリ
    • 依存関係.dll
  • プロジェクト
    • 私のプロジェクト
      • MyProject.csproj

したがって、MyProject.csproj の Dependency.dll への参照には、次のような HintPath があります。

..\..\Libs\Dependency.dll

ここで、ソースとして変更せずに、別のプロジェクト構造の別のソリューションで MyProject を使用したいと思います。これは、MyProject が独自のソース管理リポジトリにあり、Mercurial サブリポジトリ/Git サブモジュールとしてさまざまなソリューションで使用しているためです。(問題はソース管理レベルで解決されるかもしれません...) そのような別の解決策は次のようになります:

  • ライブラリ
    • 依存関係.dll
  • 私のプロジェクト
    • MyProject.csproj

MyProject フォルダーが Libs フォルダーと同じレベルにあることに注意してください。したがって、元の HintPath は現在無効であり (そうである必要があるため..\Libs\Dependency.dll)、ビルド エラーが発生します。

これを修正する方法はありますが、異なるソリューション間で同じ csproj を維​​持する方法はありますか?

次の解決策は素晴らしいですが、csproj の変更が必要です。これは私の場合ほとんど可能ですが、そのような変更を要求できない外部コンポーネントがある場合があるため、可能であればソリューションレベルのオーバーライドを探します。

ありがとうございました。

4

1 に答える 1

2

今のところ、このブログ投稿で概説されている手法を使用して問題を解決しました。

<ItemGroup>
  <LibReferenceSearchPathFiles Include="..\..\Libs\**\*.dll">
      <InProject>false</InProject>
  </LibReferenceSearchPathFiles>
</ItemGroup>
<Target Name="BeforeResolveReferences">
  <RemoveDuplicates Inputs="@(LibReferenceSearchPathFiles->'%(RootDir)%(Directory)')">
    <Output TaskParameter="Filtered" ItemName="LibReferenceSearchPath" />
  </RemoveDuplicates>
  <CreateProperty Value="@(LibReferenceSearchPath);$(AssemblySearchPaths)">
    <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" />
  </CreateProperty>
</Target>

これにより、Libs のサブフォルダーから dll をロードできるようになります。すべての dll が Libs フォルダーのルートにある場合は、Include 値から最初のワイルドカードを削除できます。

于 2014-08-30T22:07:17.193 に答える