c# - Com+ 后期绑定(bind) c# 4.0

标签 c# .net com+

在我的程序中,我使用

动态创建 Com+ 对象(后期绑定(bind))
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(我想这些是 native 代理),还有一些被创建为 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 运行代码

最佳答案

我发现 .NET FW 在 COM 类型创建方面存在差异,据我所知,差异仅存在于 .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);

此代码适用于所有环境。

关于c# - Com+ 后期绑定(bind) c# 4.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659277/

相关文章:

c# - COM+ 远程处理错误代码 8000401a 因为身份选项卡下此用户的密码正在重置

c# - 序列化对象时省略 XML 处理指令

c# - Twilio:Trace 回复短信

.net - 有没有办法测量 Web 服务响应的大小?

asp.net - 如何将 Sitecore Droptree 源设置为项目本身

.net - 是否可以在 .Net 应用程序和 COM+ 对象之间共享事务?

C# - 检索 COM+ 组件的属性?

c# - 将 JQGRID 与 MYSQL 和 ASP.NET 连接

c# - SQL Server 连接字符串异步处理=true

c# - 如何将 DLL 引用添加到 .NET WebAPI 项目?