我在尝试在新的AppDomain中运行.dll时遇到了困难。我的对象始终是System.MarshalByRefObject
类型,所以我无法从插件中获取方法。
我现在拥有的是一个插件,它实现了一个接口并扩展了MarshalByRefObject
,如下所示:
public interface IPlugin
{
string Name { get; }
string Description { get; }
string Author { get; }
void Execute();
}
然后我的插件实现如下:
[Serializable]
public class IPPlugin : MarshalByRefObject, IPlugin
{
public string Author
{
get
{
return "John John";
}
}
public string Description
{
get
{
return "description";
}
}
public string Name
{
get
{
return "name";
}
}
public void Execute()
{
//do stuff here
}
}
所以我构建了插件,获取了dll,将其放在一个文件夹中,现在在我的项目中我试图像这样加载它:
AppDomain domain = AppDomain.CreateDomain("PluginDomain");
Object obj = domain.CreateInstanceFromAndUnwrap(path + "\\" + plugins[option].getAssemblyName(), plugins[option].getTypeName());
Console.WriteLine(obj.GetType());
if (RemotingServices.IsTransparentProxy(obj))
{
Type type = obj.GetType();
MethodInfo Execute = type.GetMethod("Execute");
Execute.Invoke(obj, null); //crashes here
}
但它在Execute.Invoke(...)
上崩溃,因为它不知道方法Execute
,因为该对象类型错误。
错误信息是:
未处理的异常:System.NullReferenceException:未将对象引用设置为对象的实例。