繁体   English   中英

Com +后期绑定c#4.0

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM