Com +后期绑定c#4.0

时间:2011-04-14 06:11:59

标签: c# .net com+

在我的程序中,我使用

动态创建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以具有管理员权限的用户身份登录

2 个答案:

答案 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?