dllを使用するC#プロジェクトがあります。プロジェクト参照にdllを追加し、プロパティCopy LocalをFalseに設定しました(そのdllのローカルコピーは必要ありません)。
コンパイルは正常に見えますが、C#アプリケーションを実行しようとすると、dllが見つかりません。
実行時にライブラリを探す場所をプロジェクトにどこで伝えることができますか?
ありがとう
このMSDNの記事をご覧ください。<probing>要素についてです。
アセンブリをロードするときに検索する共通言語ランタイムのアプリケーションベースサブディレクトリを指定します。
これにより、デフォルトの/binフォルダー以外のアセンブリを検索できる場所をアプリケーションに通知できます。
'サブディレクトリ'を検索するため、完全に異なるフォルダになることはできないことに注意してください。アプリケーションベースフォルダに存在する必要があります。
Fusion Log Viewerを使用して、アセンブリの解決に関する問題を追跡します。
DLLのローカルコピーが必要ない場合は、DLLをグローバルアセンブリキャッシュ(GAC)に配置するか、app.configまたはmachine.configにアセンブリリダイレクト命令を追加する必要があります。
プロジェクト参照に対して copylocal を false に設定するのはなぜですか? これを行うことはお勧めしません。
次の違いをご覧ください。
GAC アセンブリは常に実行時に解決されます。GAC アセンブリは、既定で共有アセンブリです (再利用を考慮して)。
ビルドを完了するために、コンパイル時の解決が使用されます。可能な限りプロジェクト参照を使用します (ソリューション内のアセンブリを使用)。使用するアセンブリのビルドを担当しておらず、それらのアセンブリがソリューションに含まれていない場合は、ファイル参照を使用します。
サードパーティのdllを自分のものと一緒に配布したくない場合は、次のいずれかを実行できます。
1)要件を記述し、dllがGACにインストールされると想定します。ほとんどの場合は機能しません。アセンブリをローカルに配置することは目的に役立ちます。システム全体の更新によって依存関係が乱れた場合でも、アプリケーションが破損することはありません。
2)弾丸をかみ、サードパーティのdllを自分のものと一緒に配布します。
3)そうすることが合法である場合(サードパーティのdllのライセンス条項に注意してください)、IL Mergeを使用してアセンブリ(自分とサードパーティ)を静的にリンクします。ILMergeを使用すると、すべての参照を含む単一のアセンブリを作成することができます。デプロイ用にパッケージ化する場合にのみマージし(カスタムmsbuild / NAntタスクがあります)、VSで開発する場合は、以前と同じように(アセンブリを参照して)実行し続けます。ILMergeは、自己完結型のコンパクトな実行可能ファイルを作成するために、かなりの数のプロジェクトで使用されています(LinqPadが思い浮かびます)。
CopyToLocalをfalseに設定すると、そのアセンブリをGACにインストールできます。
このdllを参照するには、ローカルまたはGAC(グローバルアセンブリキャッシュ)にコピーする必要があります。ローカルコピーを作成することをお勧めします。そのため、ローカルコピーをtrueに切り替えることをお勧めします。
アプリケーションは、実行可能ファイルと同じパスおよびpath-envで.dllを検索します。しかし、BtBhが言ったように、このアセンブリをGACに配置する場合にのみ、オフスイッチを使用してください。
すべての外部アセンブリを作成したものと一緒にコピーするのはなぜ悪いのですか?
すべてのアセンブリが 1 つの場所に存在するように、XCOPY 配置を使用できます。
アセンブリをデプロイするもう 1 つの方法は、アセンブリをすべて 1 つのセットアップ パッケージ (MSI) にパッケージ化することです。