220

私はビジュアルスタジオソリューションを持っています。ソリューションには多くのプロジェクトがあります。スタートアップとして機能し、他のプロジェクトを使用する 1 つのメイン プロジェクトがあります。「ProjectX」というプロジェクトが1つあります。その参照がメイン プロジェクトに追加されます。ProjectX は、ソリューションの一部ではない別の .NET dll (abc.dll など) を参照しています。

この abc.dll をメイン プロジェクトの bin/debug フォルダーにコピーする必要がありますが、そこにコピーされません。コピーされないのはなぜですか、既知の理由はありますか?

4

20 に答える 20

119

ProjectX が abc.dll を参照しているが、abc.dll で定義されている型を直接使用していない場合、abc.dll はメインの出力フォルダーにコピーされないことがわかりました。(さらに混乱させるために、ProjectX 出力フォルダーにコピーされます。)

したがって、ProjectX のどこでも abc.dll の型を明示的に使用していない場合は、ProjectX のいずれかのファイルのどこかにダミーの宣言を置きます。

AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied

すべてのクラスに対してこれを行う必要はありません。DLL のコピーを作成するには 1 回だけで十分であり、すべてが期待どおりに機能します。

補遺:これはデバッグ モードでは機能する可能性がありますが、リリースでは機能しないことに注意してください。詳細については、@nvirth の回答を参照してください。

于 2014-07-18T15:20:56.693 に答える
88

Overlord Zurgの答えへの補足です。

この方法でダミー参照を追加しましたが、デバッグ モードで動作しました。

public class DummyClass
{
    private static void Dummy()
    {
        var dummy = typeof(AbcDll.AnyClass);
    }
}

しかし、リリース モードでは、依存する dll はまだコピーされませんでした。
ただし、これは機能しました:

public class DummyClass
{
    private static void Dummy()
    {
        Action<Type> noop = _ => {};
        var dummy = typeof(AbcDll.AnyClass);
        noop(dummy);
    }
}

この情報を理解するのに実際に何時間もかかったので、共有しようと思いました。

于 2016-09-28T19:12:35.407 に答える
59

Copy Localはい、に設定する必要がありますtrue。ただし、メイン プロジェクトからそのアセンブリを参照し、同様に設定する必要があると確信しています。依存アセンブリからコピーされるだけではありません。Copy Localtrue

Copy Local下のアセンブリをクリックしてReferencesF4 を押すと、プロパティにアクセスできます。

于 2013-04-04T16:35:41.777 に答える
28

この同じ問題に遭遇しました。背景情報: ビルドする前に、新しい Project X をソリューションに追加しました。プロジェクト Y はプロジェクト X に依存し、プロジェクト A、B、C はプロジェクト Y に依存していました。

ビルド エラーは、プロジェクト A、B、C、Y、および X dll が見つからないことでした。

根本的な原因は、新しく作成されたプロジェクト X が .NET 4.5 を対象としていたのに対し、残りのソリューション プロジェクトは .NET 4.5.1 を対象としていたことです。 プロジェクト X がビルドされなかったため、残りのプロジェクトもビルドされませんでした。

新しく追加されたすべてのプロジェクトが、ソリューションの残りの部分と同じ .NET バージョンをターゲットにしていることを確認してください。

于 2015-02-22T18:27:42.947 に答える
19

これが役立つかどうかはわかりませんが、私にとっては、多くの場合、DLL を参照します (もちろん、それは自動的に bin フォルダーに追加されます)。ただし、その DLL には追加の DLL が必要になる場合があります (使用している関数によって異なります)。実際に使用しているDLLと同じフォルダーに配置する必要があるだけなので、プロジェクトでそれらを参照したくありません。

「既存のファイルを追加する」ことにより、Visual Studioでこれを実現します。Add_data フォルダー以外の場所に追加できるはずです。個人的にはルートに追加するだけです。

次に、そのファイルのプロパティを次のように変更します...

Build Action = None (これを Content のようなものに設定すると、実際には「ルート」バージョンがルートにコピーされ、ビンにコピーが追加されます)。

出力フォルダにコピー=新しいならコピー(基本的には欠落している場合のみBINフォルダに入れるが、それ以降はしない)

公開すると..追加したDLLはBINフォルダーにのみ存在し、公開場所の他の場所には存在しません(これが必要です)。

于 2016-12-06T22:30:12.767 に答える
10

探している DLL が GAC に含まれていないことを確認することもできます。ビルド マシンの GAC にファイルが既に存在する場合、Visual Studio はこれらのファイルをコピーしないことを賢明に考えていると思います。

私は最近、アセンブリが GAC に存在する必要がある SSIS パッケージをテストしていたこの状況で実行しました。それ以来、私はそれを忘れており、ビルド中にこれらの DLL が出てこないのはなぜだろうと思っていました。

(Visual Studio 開発者コマンド プロンプトから) GAC の内容を確認するには:

gacutil -l

または、読みやすくするためにファイルに出力します。

gacutil -l > output.txt
notepad.exe output.txt

アセンブリを削除するには:

gacutil -u MyProjectAssemblyName

また、ファイルを GAC から削除すると、ビルド後に \bin ディレクトリに正しく出力されたことにも注意してください (ルート プロジェクトで直接参照されていないアセンブリの場合でも)。これは、Visual Studio 2013 Update 5 にありました。

于 2016-10-03T18:09:32.027 に答える
5

参照されているアセンブリを右クリックすると、Copy Localというプロパティが表示されます。Copy Local が true に設定されている場合、アセンブリをビンに含める必要があります。ただし、Visual Studio には問題があり、参照されている dll が bin フォルダーに含まれていないことがあります...これは私にとってはうまくいった回避策です:

ここに画像の説明を入力

于 2018-01-26T03:06:56.437 に答える
3

使用する依存 DLL が、プロジェクトのアプリケーションのターゲット .NET Framework よりも高いターゲット .NET Framework を持っていないことを確認してください。

ALTこれを確認するには、プロジェクトを選択して+を押しENTER、左側から [アプリケーション] を選択してから、プロジェクトの [ターゲット フレームワーク] を選択します。

依存する DLL ターゲット フレームワーク = 4.0 で、アプリケーション DLL ターゲット フレームワーク = 3.5 の場合、これを 4.0 に変更します。

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

于 2016-11-19T11:28:36.057 に答える
2

TLDR; Visual Studio 2019 は再起動が必要な場合があります。

Microsoft.NET.Sdk プロジェクトに基づくプロジェクトを使用して、この状況に遭遇しました。

<Project Sdk="Microsoft.NET.Sdk">

具体的には:

  • Project1: ターゲット.netstandard2.1
    • Microsoft.Extensions.Logging.ConsoleNuget 経由の参照
  • Project2: ターゲット.netstandard2.1
    • Project1プロジェクト参照による参照
  • Project2Tests: ターゲット.netcoreapp3.1
    • Project2プロジェクト参照による参照

Microsoft.Extensions.Logging.Consoleテストの実行時に、 が見つからないことを示すエラー メッセージを受け取りましたが、実際には出力ディレクトリにありませんでした。

Microsoft.Extensions.Logging.Consoleに追加して問題を回避することにしましたが、ファイルに存在するにもかかわらず、Project2Visual Studio の Nuget Manager がMicrosoft.Extensions.Logging.Consoleにインストールされているとリストされていないことがわかりました。Project1Project1.csproj

Visual Studio をシャットダウンして再起動するだけで、追加の参照を追加することなく問題が解決しました。おそらく、これにより誰かが生産性の損失を 45 分間節約できるでしょう :-)

于 2020-05-01T14:49:26.437 に答える