【发布时间】:2012-12-18 08:50:27
【问题描述】:
我正在尝试使用反射在 AppDomain 中执行一些代码。 这是我的代码:
AppDomain appDomain = GetSomehowAppDomain();
string typeAssembly = GetTypeAssembly();
string typeName = GetTypeName();
object targetObject = appDomain.CreateInstanceAndUnwrap(typeAssembly, typeName);
MethodInfo methodInfo = targetObject.GetType().GetMethod(methodName);
object result = methodInfo.Invoke(targetObject, methodParams);
当此代码在网站下运行时,一切正常。
但是,当我从调用 WCF 服务的控制台应用程序执行此操作时,它会尝试调用上述代码 - methodInfo 是 null,我在最后一行得到 NullReferenceException。
顺便说一句,targetObject 是 System.Runtime.Remoting.Proxies.__TransparentProxy 类型,我假设如果它以 GoF 模式代理,这意味着我可以访问类型的成员,这是用于代理的原始来源。但是targetObject 没有typeName 类型的成员。
使用targetObject.GetType().GetMethods()我发现它有7个方法:
- GetLifetimeService
- 初始化LifetimeService
- CreateObjRef
- ToString
- 等于
- GetHashCode
- 获取类型
targetObject 应该是 WorkflowManager 类型的代理。
public class WorkflowsManager : MarshalByRefObject, ISerializable, IDisposable, IWorkflowManager
【问题讨论】:
-
您的代码中的
res是什么?您创建一个名为targetObject的对象,然后在res上调用GetType()。 -
对不起,我的错误。源代码已修复。
-
您是否还可以从
targetObject类定义中添加一些sn-ps 代码,或者这无关紧要吗? -
你的
targetObject类是从ContextBoundObject派生的吗? -
如果将定义更改为:
[ServiceContract] public class WorkflowsManager : ContextBoundObject, IDisposable, IWorkflowManager,会发生什么?