14

ちょうど今、MSBuild で奇妙な状況に遭遇しました。LibX、LibY、Exe の 3 つのプロジェクトを持つソリューションがあります。Exe は LibX を参照します。次に、LibX は LibY を参照し、いくつかのコンテンツ ファイルを持ち、サードパーティ ライブラリ (GAC とローカル lib フォルダーの両方にインストールされたいくつかのビルド済みアセンブリ) への参照も持っています。サードパーティ ライブラリは「ローカル コピー」(「プライベート」) としてマークされ、LibY の出力および LibX のコンテンツ ファイルと同様に、LibX プロジェクトの出力に表示されます。現在、Exe プロジェクトの出力には、LibX プロジェクトの出力、LibX プロジェクトのコンテンツ ファイル、LibY プロジェクトの出力 (LibX からのもの) が含まれていますが、サードパーティ ライブラリのアセンブリは含まれていません。

Exeプロジェクトでサードパーティのライブラリを直接参照することでこれを回避しましたが、これが「正しい」ソリューションだとは思いません。

以前にこの問題を抱えていた人はいますか?

4

6 に答える 6

12

Visual Studioを使用したビルドと比較して、MSBuild(つまり、コマンドライン、TFSビルドおよびその他のツール)を使用してビルドする場合の動作に違いがあります。二次参照は、MSBuildコンパイルタスクに送信される参照変数には含まれていません。

参照の解決方法を変更するために、MSBuildによって提供されるいくつかの拡張ポイントがあります。一部のプロジェクトでこの問題を修正するためにAfterResolveReferenceを正常に使用しました。ブログに、背景に関する詳細情報を投稿しました

回避策は、次のコードをvbprojまたはcsprojファイルに追加することです。

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

Microsoftは、これはConnectでは修正されないと述べています

于 2012-02-17T12:02:20.310 に答える
4

実際には、Microsoft.CSharp.targets または Microsoft.VisualBasic.targets ファイル (フレームワーク ディレクトリ、通常は C:\Windows\Microsoft.NET\Framework\v3.5 にあります) に移動し、csc または vbc タスク パラメーターを次のように変更できます。追加の参照依存関係を含めます。ファイル内 (VB ターゲット、166 行目、C# ターゲット、164 行目) を次のように変更します:\

References="@(ReferencePath)"

References="@(ReferencePath);@(ReferenceDependencyPaths)"

これは、物事の複雑さに応じて他の問題を引き起こす可能性があり、Visual Studio inproc コンパイラでトリックを実行する可能性がありますが、私が見つけた MSBuild でそれを行う唯一の方法です。

于 2008-10-02T20:27:57.857 に答える
3

ジョサントの答えはほとんどうまくいきました。試してみると、Visual Studio でエラーが発生し続けました。

IDE のインプロセス コンパイラの「参照」パラメータを設定しようとしたときに問題が発生しました。COM コンポーネントへの呼び出しからエラー HRESULT E_FAIL が返されました

私の問題の解決策は、次のように ItemGroup に条件を設定することでした。

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

これにより、Visual Studio は参照の変更を完全に無視し、ビルドはローカルでもビルド サーバーでも正常に動作します。

于 2013-02-01T22:40:57.950 に答える
2

はい、私もその問題を抱えていました。別の言い方をしたいのですが、すべての推移的な依存関係を参照としてビルド ファイルに含める必要があると思います。

于 2008-09-26T15:28:46.923 に答える
2

Alex Yakunin のソリューションと、ネイティブ dll の .xml もコピーするソリューションを組み合わせました。

于 2011-05-02T06:54:36.213 に答える
0

AfterResolveReferences メソッドは、「dll の別のコピーをデプロイしようとしています」というエラーのあるツリーではなく有向グラフを取得した場合に失敗します。(cf.依存アセンブリの依存ファイルを展開するように msbuild/MSVC を構成する方法)

于 2012-03-16T18:38:56.913 に答える