30

次の構造を持つソリューションがあるとします。

  • Project.DAL - データ アクセス レイヤーは、下位​​レベルのライブラリに依存します。たとえば、Oracle.DataAccess w/copy local = true
  • Project.BLL - ビジネス ロジック層、Project.DAL をプロジェクトとして参照
  • Project.UI - UI レイヤー、実行可能ファイルにコンパイル、Project.BLL を参照、既定のプロジェクト

Project.UI がコンパイルされると、VS は Project.DAL.dll を出力ディレクトリにコピーするほどスマートですが、クライアントに配布するために Oracle.DataAccess を出力ディレクトリにもコピーする必要があることを理解するほどスマートではありません。 .

なぜそうなのか、誰か説明できますか?それは、GAC で Oracle.DataAccess を認識し、クライアントが GAC にもそれを持っていると想定しているためですか?

それほど大したことではありませんが、新しいアセンブリ参照を追加するたびに、それをローカルにコピーするように設定し、それをビルド スクリプトにもコピーするための項目を追加する必要があるのはちょっと面倒です。

4

4 に答える 4

31

もう一つ。

コードで参照されているDLLをまったく使用しない場合、CopyLocalは無視され、出力ディレクトリにコピーされません。

于 2010-02-14T17:36:31.907 に答える
26

はい。Visual Studio は、次の 2 つの条件のいずれかで DLL を出力パスにコピーします。

  1. DLL が CopyLocal = true で明示的に参照されている
  2. DLL が CopyLocal なしで参照されているか、他の参照されている DLLを介して暗黙的に参照されており、GAC に含まれていない

ファイルが GAC にあるときにコピー ローカルにならない理由は、アセンブリ名を解決するときに GAC が最も優先されるためです。つまり、(別の) ローカル コピーがある場合でも、GAC のバージョンが使用されます。

参照されるすべての外部アセンブリを配置するライブラリ ディレクトリを設定することをお勧めします。次に、Oracle ファイルが gac されていない (またはそのために Visual Studio がインストールされていない) コンピューター (または VM) で自動 MSBuild スクリプトをセットアップします。そうすれば、ファイルがビルドにコピーされ、VS を使用する場合よりも実行内容をより詳細に制御できます。

于 2009-02-02T16:49:14.863 に答える
17

アセンブリがプロジェクト参照であり、参照プロパティウィンドウに「True」と表示されている「ローカルコピー」で参照されていても、DLLが出力ディレクトリにコピーされていないという奇妙な状況がありました。以前のバージョンのDLLがGACにありましたが、これによってDLLのコピーが妨げられる理由がわかりませんでした。

プロジェクトをアンロードし、プロジェクト参照XMLを次のように手動で編集することで、次のことがわかりました。

<ProjectReference Include="..\SomeProject.csproj">
  <Project>{11111111-1111-1111-1111-111111111111}</Project>
  <Name>Some Project Name</Name>
  <Private>True</Private>
</ProjectReference>

DLLは、期待どおりに出力ディレクトリにコピーされました。プロパティウィンドウでCopyLocalをTrueに設定するだけで<Private>要素が完全に欠落していることがわかりましたが、falseに設定されている場合は、値が「False」で存在していました。

于 2010-05-13T15:47:19.390 に答える
3

@RenniePet 上記のコメントで説明されている RenniePet メソッドを説明するブログへのリンクを次に示します (@Shaun が提案したようにプロジェクト ファイルを手動で編集したくない場合)。

http://blogs.msdn.com/b/jjameson/archive/2009/11/18/the-copy-local-bug-in-visual-studio.aspx

于 2013-11-28T23:06:32.973 に答える