15

CopyLocal=TRueでSystem.Web.Mvcを参照する「プロジェクトA」があります。System.Web.Mvcは、ローカルマシンとビルドサーバーの両方のGACにあります。

また、「プロジェクトB」の出力で「プロジェクトA」を参照する「プロジェクトB」があります。System.Web.Mvcはビルド中にコピーされません。

これはGACにあるからだと思います。これは本当ですか?そして、MSBuildにそれを出力フォルダーにコピーさせるために何かをすることはできますか?

このスレッドでMuseVsExtensionsからの回答を読みました。これは、GACへの直接参照についてのみ説明していますが、「プロジェクトA」を介した間接参照があります。.NET 参照「ローカルコピー」True/Falseの内容に基づいて設定GAC

このブログ投稿も関連しています:http: //deeperdesign.wordpress.com/2010/02/08/msbuild-assembly-dependencies-and-the-gac/

4

3 に答える 3

3

実用的な (ハックを読む) 解決策は、「プロジェクト B」で System.Web.Mvc.dll を参照することです。これは間違いなく正しい解決策ではないので、より良い解決策を教えてください:-)

于 2011-11-24T12:47:53.383 に答える
1

私がこれについて浮かんでいるのを見た 1 つの提案は、すべてのプロジェクトが同じ出力パスを持つように変更することです。Prj B > Prj A > Lib C のような依存関係チェーンがある場合は、おそらく Prj A が複数のアプリケーションで共有されており、それぞれに独自の出力パスが必要なためです。

代わりに MSBuild を使用してコンパイルし、各ビルドで OutDir プロパティを設定することで問題を解決しました。

例えばMSBuild projectB.csproj /p:OutDir=C:\AppBOutput\

これにより、プロジェクト B、その依存プロジェクト (prj A)、および prj As の出力がすべて C:\AppBOutput\ ディレクトリにコピーされます。

機能する理由

Visual Studio でプロジェクトをビルドすると、prj A と prj B の両方に独自の出力ディレクトリ (例:prjA\bin\debugおよびprjB\bin\debug. copylocal に設定された GAC 格納アセンブリは、それを直接参照するプロジェクト (prjA) の出力ディレクトリに含まれます。ただし、そのプロジェクト (prjB) を参照しているプロジェクトの出力ディレクトリにはコピーされません。これが、プロジェクト参照のコピーがどのように機能するかです。MSBuild ターゲットを掘り下げると、根本的な理由が見つかると確信しています (申し訳ありませんが、自分で行っていません)。

/p:OutDir=C:\AppBOutput\MSBuild パラメーターが行うことは、すべてのプロジェクトの出力ディレクトリを同じに設定することです。これにより、プロジェクト間の参照出力をコピーする方法に関する MSBuild の動作を回避できます。MSBuild を使用して一部のコンテンツをprjA\bin\debugにコピーする代わりにprjB\bin\debug、すべてのプロジェクトを強制的に同じディレクトリに出力するだけです。

于 2012-01-23T21:03:44.290 に答える