56

MainProj他のいくつかの DLL プロジェクトを参照する C# プロジェクト (と呼びます) があります。これらのプロジェクトをMainProjの参照に追加することにより、プロジェクトがビルドされ、結果の DLL が MainProj の作業ディレクトリにコピーされます。

私がやりたいのは、これらの参照される DLL をMainProj、作業ディレクトリ自体ではなく、 の作業ディレクトリ、つまり MainProj/bin/DLLs のサブディレクトリに配置することです。

私は経験豊富な C# プログラマーではありませんが、C++ の世界から来たので、1 つのアプローチは、プロジェクト参照を削除し、必要な DLL をパスとファイル名 (つまり、C++ でLoadLibrary) で明示的にロードすることだと思います。ただし、方法があれば、ある種の「参照バイナリパス」を設定することをお勧めします。これにより、ビルド時にすべてがこのサブディレクトリに自動コピーされます(その後、そこから参照されます)。私は明示的にそれぞれをロードする必要があります)。そのようなことは可能ですか?

そうでない場合、私が求めていることを達成するためにC#で推奨される方法は何ですか(つまり、Assembly.Load/ Assembly.LoadFile/を使用したもの、またはおそらくAssembly.LoadFrom? の何か)AppDomainSystem.Environment

4

3 に答える 3

88

このページから(私はテストしていません):

プログラムの初期化のどこかで (参照されたアセンブリからクラスにアクセスする前に)、次のようにします。

AppDomain.CurrentDomain.AppendPrivatePath(@"bin\DLLs");

編集: この記事では、 AppendPrivatePath は廃止されたと見なされていますが、回避策も提供しています。

編集 2:これを行う最も簡単で最もコーシャな方法は、app.config ファイルにあるようです (こちらを参照)。

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin\DLLs" />
    </assemblyBinding>
  </runtime>
</configuration>
于 2009-12-12T06:04:08.757 に答える
27

Tomekの回答から: Loading dlls from path specified in SetdllDirectory in c#

var dllDirectory = @"C:/some/path";
Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory)

それは私にとって完璧に機能します!

于 2014-03-21T12:16:04.753 に答える