3

私のシナリオは、AppDomains を作成する .net アプリケーション (コンソール アプリとしましょう) があるというものです。次に、インスタンスを作成し、その AppDomain にある型でメソッドを呼び出す必要があります。各 AppDomain には、依存関係があるべき特定のディレクトリがあります。これは、コンソール アプリ ディレクトリの下 (または近く) ではありません。これが私の簡単なコードです:

string baseDirectory = "c:\foo"; // <- where AppDomain's dependecies 

// set up the app domain
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = DateTime.Now.ToString("hh:MM:ss:ffff");
setup.ApplicationBase = baseDirectory;
setup.PrivateBinPath = baseDirectory;

// create app domain
AppDomain domain = AppDomain.CreateDomain(
    name,
    AppDomain.CurrentDomain.Evidence,
    setup );

// instantiate Type from an assembly in that AppDomain
ObjectHandle handle = domain.CreateInstanceFrom(
    "SampleClassLibrary.dll", // <- exists in "c:\foo" 
    "SomeClassInTheDll" ); 

CreateInstanceFrom を呼び出すと、FileNotFoundExcepotion が発生します。FusionLog は、検索したディレクトリがコンソール アプリケーション ディレクトリであったことを示しています。「baseDirecory」変数に、AppDomain から設定された検索フォルダーは含まれていませんでした。

私は何を間違っていますか?別の AppDomain にあるコードを実行する別の方法はありますか?

ありがとう...

4

2 に答える 2

3

1 つの回避策は、フル パスを .CreateInstanceFrom 呼び出しに渡すことです。

ObjectHandle handle = domain.CreateInstanceFrom( 
    baseDirectory + @"\SampleClassLibrary.dll", // <- exists in "c:\foo"  
    "SomeClassInTheDll" );
于 2010-01-16T01:33:01.213 に答える
0

あなたのコードはうまくいくように見えるので、何が問題なのかはわかりません。ただし、これを行ったとき、作業を行うヘルパーを作成しました。おおよそ次のようになります。

public class Loader
{
    public void Load(string typename)
    {
        // ....
    }
}

Loader l = (Loader)domain.CreateInstanceAndUnwrap("Loader");
l.Load("SomeClassInTheDll");
于 2010-01-16T01:20:48.600 に答える