web-dev-qa-db-ja.com

C#必要なDLLを出力のルート以外の場所に置く

私はプロジェクトにEmguCVを使用しています。プログラムを実行するとき、「cxcore.dll」などのDLLが必要です(または実行時例外がスローされます)。現時点では、ファイルを出力フォルダーのルートに配置します(Visual Studioのファイルのプロパティで[常にコピー]を選択)。

ただし、そこには約10個の異なるDLLがあるため、少し面倒です。出力フォルダーのサブフォルダーに移動できる場所がどこかにありますが、それでも見つかります。

29
Aishwar

これまでに素晴らしい答え。不正解です;)まあ、

はい、アセンブリを別の場所に配置できます。

対応するアプリケーション設定(app.configにコピーされるyour.exe.config)に次を追加します。

<runtime>
  <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <probing privatePath="lib" />
  </assemblyBinding>
</runtime>

による:

http://msdn.Microsoft.com/en-us/library/823z9h8w.aspx

これにより、Webアプリケーションが/ binを探すように、プログラムはアセンブリのプライベートパス(その独自のフォルダーの下のフォルダー)を調べます。

それらをGACに配置することもできますが、これ以外の理由がない限り、これは避けてください。

そうは言っても、本当にする必要はありません。スタートメニューでアプリケーションを適切にインストールすれば、ユーザーが混乱することはありません;)50以上のアセンブリを含むプロジェクトを含め、私はその問題に遭遇したことはありません。ユーザーsimlpyがそれらを見ることはありません。

63
TomTom

サブディレクトリにアセンブリを取得するには、アセンブリを手動でそこにコピーするか、ビルド前またはビルド後のイベントまたはまったく異なるものを使用します。

それらをロードするには、 AppDomain.AssemblyResolve Event 、または( TomTom で示されているように) <probing>要素 。 MSDNから:

次の例は、ランタイムがアセンブリを検索する必要があるアプリケーションベースサブディレクトリを指定する方法を示しています。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

もちろん、GACはアセンブリをダンプするための別の場所ですが、実際にはインストールされるべきではない場所にアプリケーションをインストールしない限り、サブディレクトリとしては数えられません... P

20
Svish