1

.exeを作成するVisualStudio2010 C#プロジェクトがあり、このプロジェクトはサードパーティのクラスライブラリを使用しています。私のプロジェクトは次の場所にあります:/ MyFramWork / tests / test1サードパーティのライブラリは次の場所にあります:/ MyFrameWork / bin / utils /

[参照]->[参照の追加]->[参照]を使用して、ライブラリに参照を追加しています。プロジェクトファイルですべてが正常であることがわかります:.... \ bin \ utils \ log4net.dll False

[ローカルコピー]オプションを使用せずに、サードパーティのライブラリを参照したいと思います。ただし、このオプションを使用しないと、ライブラリが見つからず、例外が発生します。

私の質問は次のとおりです。サードパーティのライブラリが....\bin\utilsにあることを指定する方法はありますか。.exeがビルドされると、.csprojからの情報が失われるようです。

4

4 に答える 4

2

デフォルトでは、.NETアプリは、EXEディレクトリとGAC(グローバルアセンブリキャッシュ)の2か所でのみ依存関係を検索します。

3つの選択肢があります。

  • 依存関係がEXEと同じディレクトリにコピーされることを確認できます(これはローカルコピーが行うことです)。ほとんどの場合、これが最良の選択です。そのため、GACにまだ含まれていないアセンブリを参照する場合は、これがデフォルトになります。
  • を使用して、依存関係をGACにインストールできますgacutil。これは、依存関係が変更されない場合、すべての開発マシンの異なる場所にある場合(つまり、相対パスがうまく機能しない場合)、およびさまざまな異なる場所から使用する場合に適しています。プロジェクト。しかし、依存関係がまだ活発に開発されており、頻繁に変更されている場合、それは大きな苦痛です。また、アプリをデプロイするすべてのコンピューターのGACにDLLを配置する必要があります。
  • ハンスがコメントで述べたように、依存関係の読み込み動作をカスタマイズして、他の場所で表示されるようにすることができます。これは高度なオプションであり、まったく新しい一連の頭痛の種が伴います。

通常は、ローカルコピーを使用します。これは非常に賢明なデフォルトです。何か違うことをするためには、かなり説得力のある理由が必要です。

于 2012-04-07T15:50:15.793 に答える
1

この要素を使用して<probing>、CLRがアセンブリを検索する場所を指定します。唯一の制限は、アセンブリをアプリケーションのベースディレクトリのサブディレクトリに配置する必要があることです。

たとえば、アプリケーションのベースディレクトリがC:\MyFrameworkである場合、アセンブリをに含めることができますC:\MyFramework\bin

CLRがアセンブリを検索する方法については、この記事をご覧ください。

于 2012-04-07T16:42:22.367 に答える
0

カスタムの場所からアセンブリをロードする必要がある場合は、Assembly.LoadFileメソッドを試すことができます。

次のリンクが役立つ場合があります。

C#-アセンブリをロードし、クラスを検索し、Run()メソッドを呼び出す正しい方法

http://www.csharp-examples.net/reflection-examples/

于 2012-04-07T18:00:19.663 に答える
0

私はポッツォンです。私はまだこの信じられないほどばかげた問題を調査しています。

私はいくつかのエレガントな解決策を望んでいました。/ Framework /bin/内に配置される多くのアセンブリを使用してかなり大きなフレームワークを構築しようとしています。ただし、ディレクトリ内に/ bin / utils、/ bin / test、/ bin /devices/などのディレクトリ構造が必要でした。

私が見つけた1つの可能な解決策は、環境変数DEVPATH(ここhttp://msdn.microsoft.com/en-us/library/cskzh7h6.aspxを参照)を定義することですが、.net4はこの変数を使用していないことがわかります。アセンブリは独立して(ビジュアルスタジオの外で)実行されます。または、少なくともこれは私の場合です-私はそれを機能させることができません。

サブディレクトリを使用せずにすべてのアセンブリを/binディレクトリ内に配置するソリューションが最適のようです。私はあきらめて、このようにするだけだと思います。

于 2012-04-11T08:58:27.840 に答える