在我的程序中,我使用
动态创建 Com+ 对象(后期绑定(bind))Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
然后使用反射调用其中一个方法
object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});
它在 .Net 1.1/2.0/3.5 中运行良好
现在我试图在为 .Net 4.0 编译的同一台机器 (Windows XP) 上运行相同的代码,但我有一个
Exception: Method 'System.__ComObject.{MethodName}' not found.
我得到了大多数 Com+ 对象(不是全部)的异常。 有人知道问题出在哪里吗? 为什么在 FW 4.0 环境下会出现异常? 我应该怎么做才能避免它?
非常感谢, 丹尼尔
经过更多调查后,我发现一些 Com+ 代理被创建为 System._ComObject
(我想这些是 native 代理),还有一些被创建为 System. Runtime.Remoting.Proxies._TransparentProxy
(我认为那些是 .Net Com+ 对象)。方法调用适用于那些创建为 System._ComObject
的方法,但不适用于 System.Runtime.Remoting.Proxies._TransparentProxy
。
最有趣的事实是,在 .Net 2.0 中,所有对象都以相同的方式创建(_ComObject
和 _TransparentProxy
),但方法调用确实工作正常。
另一个有趣的事实是,我可以使用反射器在调试器中看到“缺失”方法
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
我想了一会儿这可能是一个安全问题,但我以具有管理员权限的用户身份登录 WindowsService 运行代码
最佳答案
我发现 .NET FW 在 COM 类型创建方面存在差异,据我所知,差异仅存在于 .NET COM 对象。当使用
创建 COM 对象类型时Type comObjectType = Type.GetTypeFromProgID(progId, true);
在.NET 1.1/2.0/3.5 中返回的类型是对象的实际.NET 类型,因此其方法调用没有问题,但在.NET 4.0 中System.__ComObject
类型被返回所以代码
result = comObjectType.InvokeMember(
MethodToActivate, BindingFlags.InvokeMethod, null, ObjectToActivate, InputParams);
因未找到方法异常而失败。
我找到的解决方案如下:
Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
// here the real object type is returned
Type acctualObjectType = comObject.GetType();
result = acctualObjectType.InvokeMember(
"MethodToActivate", BindingFlags.InvokeMethod, null, comObject, InputParams);
此代码适用于所有环境。
关于c# - Com+ 后期绑定(bind) c# 4.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659277/