在我的程序中,我使用
动态创建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
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
我想了一下,这可能是一个安全问题,但我运行代码,因为WindowsService以具有管理员权限的用户身份登录
答案 0 :(得分:7)
我发现在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);
此代码适用于所有环境。
答案 1 :(得分:1)
我不确定为什么以前运行的代码不再有效但我相信在.Net 4.0中你可以通过dynamic
类型使用IDispatch / late binding来调用COM方法 - 请参阅Does C# .NET support IDispatch late binding?。