问题描述
|
在我的程序中,我使用以下方法动态创建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后期绑定?