我在这里实现一些答案有些困难,因为我试图从不同的程序集中实例化一个对象(但在同一解决方案中)。所以我想我会发布我发现有用的东西。
首先,该Activator.CreateInstance
方法有多个重载。如果仅调用Activator.CreateInstance(Type.GetType("MyObj"))
,则假定该对象已在当前程序集中定义,并且返回MyObj
。
如果按照此处的答案中的建议进行调用Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
,则它返回ObjectHandle
,而您需要对其进行调用Unwrap()
以获取您的对象。当尝试调用在不同程序集中定义的方法时,此重载很有用(顺便说一句,您可以在当前程序集中使用此重载,只需将AssemblyName
参数保留为null)。
现在,我发现上面使用的建议typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
进行AssemblyName
居然给我的错误,我不能得到那个工作。我会得到System.IO.FileLoadException
(无法加载文件或程序集...)。
我所做的工作如下:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();