Com +后期绑定c#4.0

Dan*_*zon 9 .net c# com+

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

Type comObjectType = Type.GetTypeFromProgID(progId, true); 
object comObject = Activator.CreateInstance(comObjectType); 
Run Code Online (Sandbox Code Playgroud)

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

object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});
Run Code Online (Sandbox Code Playgroud)

它在.Net 1.1/2.0/3.5中有效

现在我正在尝试在为.Net 4.0编译的同一台机器(Windows XP)上运行相同的代码,但我有一个

Exception: Method 'System.__ComObject.{MethodName}' not found. 
Run Code Online (Sandbox Code Playgroud)

我有大多数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以具有管理员权限的用户身份登录

Dan*_*zon 7

我发现,有创作COM类型的.NET FW之间的差异,而据我理解上的差异只存在于.NET COM对象.使用时创建COM对象类型

Type comObjectType = Type.GetTypeFromProgID(progId, true);
Run Code Online (Sandbox Code Playgroud)

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

result = comObjectType.InvokeMember(
   MethodToActivate, BindingFlags.InvokeMethod, null, ObjectToActivate, InputParams);
Run Code Online (Sandbox Code Playgroud)

失败的方法未找到异常.

我找到的解决方案如下:

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);
Run Code Online (Sandbox Code Playgroud)

此代码适用于所有环境.