[英]Com+ late binding c# 4.0
在我的程序中,我使用动态创建Com +对象(后期绑定)
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
创建的(我想是那些是原生代码),有些是作为System.Runtime.Remoting.Proxies._TransparentProxy
创建的(我认为那些是.Net Com +对象)。 方法调用适用于那些作为System._ComObject
创建的方法,并且不适用于System.Runtime.Remoting.Proxies._TransparentProxy
。 最_ComObject
事实是,在.Net 2.0中,所有对象都以相同的方式创建( _ComObject
和_TransparentProxy
),但方法调用确实可以正常工作。 另一个有趣的事实是,我可以使用reflecton在调试器中看到“丢失”方法
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
我想了一下它可能是一个安全问题,但我运行代码,因为WindowsService以具有管理员权限的用户身份登录
我发现在COM类型创建中.NET FW之间存在差异,据我所知,仅存在.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);
此代码适用于所有环境。
我不确定为什么你以前运行的代码不再有效但是我相信在.Net 4.0中你可以通过dynamic
类型使用IDispatch / late binding来调用COM方法 - 请参阅C#.NET是否支持IDispatch后期绑定? 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.