在我的节目我用COM +后期绑定C#4.0
Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
,然后使用反射调用的方法之一创建COM +对象动态地(后期绑定)
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
),但方法调用确实工作正常。 另一个有趣的事实是,我可以用几点思考
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
我想对于一些时刻,它可能是一个安全问题看在调试器中“失踪”的方法,但我运行代码WindowsService登录作为具有管理员权限的用户
您是否检查过任何32/64位问题?也许你的程序是64位的,因此打到64位COM注册表(没有人住:-)? – 2011-04-27 06:17:03
我不认为这是一个32/34位的问题,我的本地机器是32位,远程服务器 – 2011-04-27 07:14:53
对32/64位也是如此。现在,它看起来像你的COM服务器不在进程中或具有特定的线程模型(因此代理)。你能提供更多细节吗?他们托管在过程之外吗?在组件服务中?那么Invoke参数呢?你确定没有歧义吗?那BindingFlags呢?你不需要Public | Instance吗? – 2011-04-27 07:49:12