一般に、アプリ ドメイン間で共有されるオブジェクトは、MarshalByRefObjectから派生する必要があります。動的に読み込まれた DLL で型が定義されている場合、実際の型を返す際に問題が発生します。タイプはメインスレッドの AppDomain では利用できないためです。メイン アプリケーション スレッドに既に読み込まれている DLL で使用できる基本クラスにキャストできる場合があります。
過去に行ったことは、アプリ ドメイン間で共有したいクラスのインターフェイスを作成することでした。明らかに、インターフェイスは、メイン アプリケーションと動的にロードされた dll の両方で共有されるいくつかの基本 dll にあります。
ベース dll で、インターフェイスを宣言できます。
public interface IMyBaseInterface
{
void DoStuff();
}
次に、動的にロードされた dll で、クラスはインターフェイスを実装し、MarshalByRefObject から派生します。
public class MyDynamicClass : MarshalByRefObject, IMyBaseInterface
{
public void DoStuff()
{
Console.WriteLine("Hello other app domain!");
}
}
オブジェクトのインスタンスをロードするコードは次のようになります。
AppDomainSetup ads = new AppDomainSetup();
AppDomain appDomain = AppDomain.CreateDomain(_appDomainName, null, ads);
IMyBaseInterface myObj = (IMyBaseInterface) appDomain.CreateInstanceAndUnwrap(assemblyName, typeName);
myObj.DoStuff();