在64位模式下运行的C#中调用32位COM

9
我有一个第三方COM对象(32位),需要从我的C#应用程序(64位)中调用它。我知道我必须在单独的进程中运行COM对象。这个COM对象中实现了许多类,因此我试图避免编写自己的远程包装器来公开所有方法。 COM +似乎是最直接的解决方案。我打开了组件服务菜单,创建了一个新的COM +应用程序,并将我的COM对象作为该应用程序的组件添加。一切都看起来很顺利。
在我的C#应用程序中,我添加了原始COM对象作为引用(自动生成类型库)。使用类型库引用,我可以从COM +组件创建对象(我看到它们开始在组件服务窗口中旋转),但是当我尝试访问对象的某个方法时,会出现错误,表示接口未注册。
有人有线索吗?我回去运行了COM对象上的regsvr32,但我认为这并不是必要的,而且没有帮助。我的C#使用是否正确?VS2008自动完成没有问题看到那些方法。
确切的异常是:“接口未注册(HRESULT:0x80040155的异常)”
对于组件服务中的权限和角色,我不清楚具体是什么,因此我尝试设置COM+对象标识以在系统帐户下运行,既作为本地服务又作为交互式用户。我已将所有人都添加为角色中的用户。一切都在本地运行,因此不应该存在文件权限或类似问题。
我还要重申,这个COM对象包含许多类。我成功实例化了一个客户端类对象并设置了一些属性值。我也成功实例化了另一个类对象,但在尝试调用这个第二个对象的方法时收到了此异常...所以我认为与我的COM对象注册在哪个注册表中无关。

COM+对权限等非常依赖。也许这就是问题所在... - Yahia
4
Windows实际上有两个不同的注册表,一个是32位的,另一个是64位的。我相信接口在其中一个注册表中被注册,然后在另一个注册表中被查找。 - GSerg
GSerg是正确的。如果注册它的应用程序是32位的,在64位系统上运行,所有的注册表条目都会以镜像的WOW6432节点结束,而不是它们通常所在的位置。 - Ed Bayiates
"interface not registered"? 我不相信。HRESULT值是什么?导致问题的最简单方法的签名是什么? - sharptooth
1
如果是我,我会切换到32位应用程序,并在进程内运行COM相关内容。 - David Heffernan
2个回答

2
我们曾经遇到过类似的情况,需要使用来自VFP的COM dll。
这一切都取决于权限和许可,正如Yahia所说。我们通过以下方式使其工作:
  • 安装VFP oledb 9驱动程序(如果您没有则可能不需要)。
  • 在COM文件夹上为Network Service IIS_IUSR授予完全控制权限(这是必需的,以便当从网站调用时DLL可以在其自己的文件夹中进行一些日志记录)。
  • 运行regsvr32.exe "c:\xxx\yourfile.dll" -> 这应该会成功!
  • 创建COM+应用程序,并将DLL添加为其中一部分
  • 将应用程序COM+凭据设置为具有足够权限的用户
我们还需要在应用程序池/IIS上进行一些权限设置,但我想您可能不需要这样做。
无论如何,请确保您有足够的日志记录,确保dll已注册,之后就是关于权限的问题了。
祝你好运!

1

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接