2011-07-28 78 views
9

我有一个第三方COM对象(32位),我需要从我的C#应用​​程序(64位)调用。 我知道我必须在单独的进程中运行COM对象。 这个COM对象有许多实现的类,所以我试图避免编写我自己的公开所有方法的远程包装器。 COM +似乎是最直接的解决方案。我打开组件服务菜单,创建一个新的COM +应用程序,将我的COM对象作为组件添加到此应用程序中。一切都似乎进口美丽。调用32位COM从C#运行在64位模式

以我C#应用程序,我添加原COM对象为基准(自动生成类型库)。使用类型库引用,我可以从COM +组件创建对象(我看到它们开始在组件服务窗口中旋转),但是当我尝试访问对象的方法时,出现错误,说明接口未注册。

有没有人有线索?我回去并在COM对象上运行了regsvr32,但我认为这不是必要的,也没有帮助。 我在C#中的用法是否正确?看到这些方法,VS2008自动完成没有任何问题。

确切的例外是: “接口未注册(从HRESULT异常:0x80040155)”

不清楚究竟有哪些权限和角色有关的组件服务,我尝试了COM +对象标识设置到在系统帐户下运行,作为本地服务和交互式用户。我已将角色添加为角色中的用户。 一切都在本地运行,所以不应该有文件权限或类似的问题。

我也想重申,此COM对象包含很多类。我成功地在客户端实例化了一个类对象并设置了一些属性值。 我还成功实例化另一个类的对象,但收到试图调用这个第二对象的方法时,此异常....所以我不认为是哪一本登记册我的COM对象在注册的问题。

+0

COM +非常依赖于权限等。也许这是怎么回事...... – Yahia

+4

Windows有效地拥有两个不同的注册表,一个用于32位,一个用于64位。我相信这个接口是在一个接口中注册的,然后在另一个接口中进行注册。 – GSerg

+0

GSerg是正确的。如果注册它的应用程序是32位,在64位系统上运行,则所有注册表项都会在镜像的WOW6432节点中结束,而不是在通常的情况下运行。 –

回答

2

我们有类似的情况,使用VFP的COM DLL。

这一切都取决于权利和权限,像叶海亚说。 我们得到了它的工作通过这样做:

  • 安装VFP OLEDB 9驱动程序(不知道你有什么,所以可能不需要)。
  • 给网络服务IIS_IUSR在COM文件夹(必须使DLL可以在自己的文件夹做一些记录,从网站调用时)的完全控制。
  • 运行regsvr32.exe“c:\ xxx \ yourfile.dll” - >这应该是成功的!
  • 创建COM +应用程序,并添加DLL的一部分
  • 设置应用程序COM +证书上的用户为对象的分析足够的权限

,我们不得不对应用程序池/ IIS权利做一些更多的设置,但那不是我所要求的。

不管怎么说,只要确保你有足够的日志记录,确保该dll被注册,之后,它的所有关于版权权利的权利..

祝你好运吧!

1

对不起,使用“回答”回复评论,但它似乎是我唯一的途径。

转移到64位操作系统的全部目的是为了获得额外的可寻址内存空间,因此在32位模式下运行整个应用程序不是一种选择。

这可能与问题有关,在成功创建三个类对象后,我可以在一个属性中设置属性,在第二个参数中调用一个没有参数的方法,但它在第三个参数中调用一个方法,另外两个对象作为抛出异常的参数。