我有一个第 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/