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

标签 c# .net com 64-bit

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

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

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

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

不清楚组件服务中权限和角色的确切含义,我尝试设置 COM+ 对象身份以在系统帐户下运行,既作为本地服务又作为交互式用户。我已将 Everyone 添加为角色中的用户。 一切都在本地运行,因此文件权限或类似问题不应该有问题。

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

最佳答案

我们有类似的情况,使用来自 VFP 的 COM dll。

正如 Yahia 所说,这完全取决于权利和许可。 我们通过这样做让它工作:

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

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

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

祝你好运!

关于c# - 从以 64 位模式运行的 c# 调用 32 位 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6852704/

相关文章:

c# - 从不同线程更新主窗口中的进度条

c# - 向我的数据库程序插入函数的问题

c# - 建立团队和开发流程

.net - 在运行时获取 OutofMemoryException 消息 "Insufficient memory to continue the execution of the program"

c# - 通过 COM 互操作从 C++ 抛出到 C# 时丢失异常详细信息?

internet-explorer - 如何获取对嵌入在另一个应用程序中的 Internet Explorer 实例的 COM 引用

python - 使用 comtypes.client.GetModule() 为 dll 文件生成 python 包装器时出现断言错误

c# - 使用泛型参数创建方法

c# - 卡在具有多个连接的 SQL 查询上

c# - 有没有办法以编程方式最小化窗口