首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Com+后期绑定c# 4.0

Com+后期绑定c# 4.0
EN

Stack Overflow用户
提问于 2011-04-14 06:11:58
回答 2查看 5.1K关注 0票数 10

在我的程序中,我使用以下方法动态创建Com+对象(后期绑定)

代码语言:javascript
复制
Type comObjectType = Type.GetTypeFromProgID(progId, true); 
object comObject = Activator.CreateInstance(comObjectType); 

然后调用其中一个使用反射的方法。

代码语言:javascript
复制
object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});

它在.Net 1.1/2.0/3.5中运行得很好。

现在,我试图在为Windows4.0编译的同一台计算机(Windows )上运行相同的代码,但我有一个

代码语言:javascript
复制
Exception: Method 'System.__ComObject.{MethodName}' not found. 

对于大多数Com+对象(不是所有对象),我都有例外。有人知道问题出在哪里吗?为什么在FW4.0环境中会出现异常?我该怎么做才能避免呢?

非常感谢,丹尼尔

经过进一步的研究,我发现一些Com+代理被创建为System._ComObject (我想这些是本地代理),还有一些被创建为System.Runtime.Remoting.Proxies._TransparentProxy (我认为它们是.Net Com+对象)。方法调用对于那些创建为System._ComObject而不适用于System.Runtime.Remoting.Proxies._TransparentProxy的调用很好。最令人感兴趣的事实是,在.Net 2.0中,所有对象都是以相同的方式创建的(_ComObject_TransparentProxy),但是方法调用确实工作得很好。另一个有趣的事实是,我可以使用反射器在调试器中看到“缺失”方法。

((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()

有一段时间,我认为这可能是一个安全问题,但我以具有管理员权限的用户身份以WindowsService身份运行代码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 11:33:42

我发现,在创建COM类型时,.NET FW之间存在差异,据我所知,这种差异只存在于.NET COM对象。创建COM对象类型时,

代码语言:javascript
复制
Type comObjectType = Type.GetTypeFromProgID(progId, true);

在.NET 1.1/2.0/3.5中返回的类型是对象的实际.NET类型,因此它的方法调用没有问题,但是在.NET 4.0中返回System.__ComObject类型,所以代码

代码语言:javascript
复制
result = comObjectType.InvokeMember(
   MethodToActivate, BindingFlags.InvokeMethod, null, ObjectToActivate, InputParams);

如果方法未找到异常,则会失败。

我发现的解决办法如下:

代码语言:javascript
复制
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);

此代码适用于所有环境。

票数 8
EN

Stack Overflow用户

发布于 2011-04-27 06:03:28

我不知道为什么以前运行的代码不再工作,但是我相信在.Net 4.0中,您可以通过dynamic类型使用IDispatch / late绑定调用COM方法--参见Does C# .NET support IDispatch late binding?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5659277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档