2011-07-02 7 views
2

私はApplicationBaseとPrivateBinPath(例えばsake)がC:\MyAppに設定された新しいサンドボックスAppDomainを作成しています。実行中のアプリケーションはC:\SomewhereElseです。現在のAppDomainアプリケーションベース以外のアセンブリをロードしていますか?

I otherDomain.Load(...)アセンブリを実行すると、実行中のAppDomainもアセンブリをロードしています。私はロードの前にGetAssemblies()をチェックし、ロード後にGetAssemblies()をチェックすることでこれを判断しています。

どうしてですか?私はそれが実行中のAppDomainで利用可能にする必要があるメタデータと関係があり、新しいドメインから 'Cross Boundary'を経由して返されると思われるので、呼び出し側ドメインもアセンブリをロードしています。しかし!私はアセンブリがそれがApplicationBaseの外にロードできないと思っていましたが、GACに入っていなければ、この場合はそうではありません。

誰でも私の混乱を助けることができますか?

答えて

1

2番目のappdomainのアセンブリを親ドメインにロードしないようにするには、otherdomain.Load(...)を使用できません。子appDomainにMarshalByRefObjectを作成し、そのコードでAppDomain.Load(...)を呼び出す必要があります。

例:

public class AppDomainInitializer : MarshalByRefObject 
{ 
    public void Initialize() { AppDomain.Load(...); } 
} 

親ドメイン:

{ 
AppDomain otherDomain = AppDomain.CreateDomain(...); 

// Create the object in the other domain 
ObjectHandle oh = Activator.CreateInstance(otherDomain, assemblyNme, "AppDomainInitializer", ...); 

// Marshall it to this domain 
var initializer = (AppDomainInitializer) oh.UnWrap(); 

// Proxy the call to load up the other domain dll's 
intializer.Initialize();  
} 
関連する問題