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

时间:2011-07-28 00:05:03

标签: c# .net com 64-bit

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

这一切都取决于权利和许可,就像Yahia所说的那样。 我们通过这样做得到了它:

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

我们不得不对应用程序池/ IIS中的权限进行更多设置,但我认为这不是必需的。

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

祝你好运!

答案 1 :(得分:1)

很抱歉使用“答案”回复评论,但这似乎是我唯一的途径。

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

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