一般来说,应用程序域之间共享的对象必须派生自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();