从运行在64位模式下的c#调用32位COM

本文关键字:调用 32位 COM 运行 64位 模式 | 更新日期: 2023-09-27 18:03:51

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

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

有人知道吗?我回去运行regsvr32上的COM对象,但我不认为这是必要的,它没有帮助。我在c#中的使用是否正确?VS2008自动完成没有问题看到这些方法。

确切的例外是:"接口未注册(Exception from HRESULT:0x80040155)"

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

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

从运行在64位模式下的c#调用32位COM

我们也遇到过类似的情况,使用VFP中的COM dll。

就像Yahia说的,这完全取决于权利和许可。我们通过这样做使它工作:

  • 安装VFP oledb 9驱动程序(不知道你有什么,所以可能不需要)
  • 给予网络服务IIS_IUSR对COM文件夹的完全控制(当从网站调用时,DLL可以在自己的文件夹中做一些日志记录)。
  • 运行regsvr32.exe "c:'xxx'yourfile.dll" ->这应该成功!
  • 创建COM+应用程序,并添加DLL作为一部分
  • 为具有足够权限的用户设置应用程序的COM+凭据

,我们必须在应用程序池/IIS中做更多的权限设置,但我想这对你来说不是必需的。

无论如何,只要确保你有足够的日志记录,确保dll是注册的,之后就是关于权利的权利的权利。

祝你好运!

很抱歉用"Answer"来回复评论,但这似乎是我唯一的途径。

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

这可能与成功创建三个类对象后的问题有关,我能够在一个中设置属性,在第二个中调用不带参数的方法,但在第三个中调用方法,该方法将其他两个对象作为抛出异常的参数。