MSBuildは、参照プロジェクトの参照を取得しません
-
02-07-2019 - |
質問
今、MSBuildで奇妙な状況に遭遇しました。 LibX、LibY、およびExeの3つのプロジェクトがあるソリューションがあります。エグゼはLibXを参照します。 LibXは順番にLibYを参照し、コンテンツファイルがいくつかあり、サードパーティライブラリ(GACとローカルlibフォルダーの両方にインストールされたいくつかの事前構築済みアセンブリ)への参照もあります。サードパーティのライブラリは「ローカルにコピー」とマークされています。 (" private")。LibYの出力ファイルとLibXのコンテンツファイルのように、LibXプロジェクトの出力に表示されます。現在、Exeプロジェクトの出力には、LibXプロジェクトの出力、LibXプロジェクトのコンテンツファイル、LibYプロジェクトの出力(LibXから取得)がありますが、サードパーティライブラリのアセンブリはありません。
今、Exeプロジェクトでサードパーティライブラリを直接参照することでこれを回避しましたが、これが「正しい」とは感じません。ソリューション。
以前に誰もこの問題を抱えていましたか?
解決
はい、私にもその問題がありました。別の言い方をしたいのですが、すべての推移的な依存関係を参照としてビルドファイルに含める必要があると思います。
他のヒント
MSBuild(コマンドライン、TFSビルド、その他のツール)を使用してビルドする場合、Visual Studioを使用してビルドする場合と動作に違いがあります。二次参照は、MSBuildコンパイルタスクに送信される参照変数には含まれません。
参照の解決方法を変更するために、MSBuildによって提供されるいくつかの拡張ポイントがあります。 AfterResolveReferenceを使用して、一部のプロジェクトでこの問題を修正しました-ブログに背景に関する詳細情報を投稿しました。
回避策は、次のコードをvbprojまたはcsprojファイルに追加することです
<Target Name="AfterResolveReferences">
<!-- Redefine referencepath to add dependencyies-->
<ItemGroup>
<ReferencePath Include="@(ReferenceDependencyPaths)">
</ReferencePath>
</ItemGroup>
</Target>
Microsoftは、これは接続では修正されないと述べています。
実際には、Microsoft.CSharp.targetsまたはMicrosoft.VisualBasic.targetsファイル(フレームワークディレクトリ、通常はC:\ Windows \ Microsoft.NET \ Framework \ v3.5にある)に移動し、cscまたはvbcを変更できます。追加の参照依存関係を含めるタスクパラメーター。ファイル(VBターゲット、行166、C#ターゲット、行164)の変更:\
References="@(ReferencePath)"
to
References="@(ReferencePath);@(ReferenceDependencyPaths)"
これは、物事の複雑さに応じて他の問題を引き起こす可能性があり、Visual Studioのインプロセスコンパイラでトリックを行う可能性がありますが、私が見つけたMSBuildでそれを行う唯一の方法です。
josantの答えはほとんど私にとってはうまくいきました。私はそれを試みたときに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は参照の変更を完全に無視し、ビルドはローカルおよびビルドサーバーで正常に動作します。
Alex Yakuninのソリューションともコピーするソリューションネイティブdll 。
「dllの異なるコピーをデプロイしようとしています」というツリーではなく、有向グラフを取得した場合、AfterResolveReferencesメソッドは失敗します。エラー。 (cf. msbuild /の設定方法依存アセンブリの依存ファイルを展開するMSVC )