Com +后期绑定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
无效。 最有趣的事实是,在.Net 2.0中,所有对象都是以相同的方式创建的(
_ComObject
_TransparentProxy
),但是方法调用确实可以正常工作。 另一个有趣的事实是,我可以在使用reflecton的调试器中看到\“ missing \”方法
((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\",comObject,InputParams);
该代码在所有环境下均能正常工作。     ,我不确定为什么以前运行的代码不再起作用,但是我相信在.Net 4.0中,您可以通过
dynamic
类型使用IDispatch /后期绑定调用COM方法-请参阅C#.NET是否支持IDispatch后期绑定?