如果我将.net程序集(这是一个exe文件)加载到我自己的appdomain中并通过refleciton获取对象引用,我想我可以获得对EXE中包含的对象的引用。
我能真的这样做吗?
这是我的示例代码......
myDomain = AppDomain.CreateDomain("MyAppDomain");
myDomain.ExecuteAssembly(exePath);
Assembly myAssembly = myDomain.GetAssemblies().Single(a => a.FullName.Contains("TestAssembly"));
Type t = commandsAssembly.GetType("TestClass");
我可以通过任何方式获得对此类对象的引用吗?
编辑: 在我的EXE的主要方法中,我创建了一个TestClass类型的对象,我想要一个对该对象的引用。我认为ExecuteAssembly将在新的appdomain中执行exe,因此当实例化EXE时,我的对象将被创建。如果我错了,请纠正我。 CreateInstance会创建一个新对象,但是我想引用我的对象,这个对象在执行EXE时被创建...可能是我以愚蠢的方式思考,请纠正我...
先谢谢
答案 0 :(得分:3)
简单方法:
object instance = Activator.CreateInstance(myType, [constructorArg1, ...]);
它假定该类型的公共构造函数。
答案 1 :(得分:2)
尝试commandsAssembly.CreateInstance ("TestClass");
或Activator.CreateInstance (t);
编辑 - 在添加之后,所有生命实例都是有意义的:
我认为实现这一目标的唯一方法是编写某种“调试器”,这实际上是一个艰难的要求...一些可能有用的链接
http://blogs.msdn.com/b/davbr/archive/2011/02/01/clrprofiler-v4-released.aspx
http://www.codeproject.com/Articles/122592/Writing-a-NET-debugger-part-1-Starting-the-debuggi
http://www.codeproject.com/Articles/122591/Writing-a-NET-debugger-part-2-Handling-events-and
http://www.codeproject.com/Articles/126142/Writing-a-net-debugger-part-3-symbol-and-source-fi
http://www.codeproject.com/Articles/132798/Writing-a-NET-debugger-part-4-breakpoints
http://msdn.microsoft.com/en-us/library/bb190764.aspx
http://msdn.microsoft.com/en-us/library/ms229861.aspx
CLR分析器需要做你想要的部分 - 源是可用的,所以也许是一个好的开始......
答案 2 :(得分:1)
是的,试试这个:
object obj = Activator.CreateInstance(Type.GetType("[AssemblyName].LoadClass, [AssemblyName]", true));
还要看一下这个讨论:C# - Correct Way to Load Assembly, Find Class and Call Run() Method