在不安装代理的情况下在 COM+ 中调用远程 .NET DLL

本文关键字:调用 DLL NET COM+ 不安 安装 代理 情况下 | 更新日期: 2023-09-27 18:33:14

我们有一个完全用.NET 4.0(C#(开发的三层应用程序。作为企业应用程序服务器,我们使用COM+ 1.5(我知道它有点遗留问题......有一个服务器部件和一个客户端部件都是用 C# for .NET 4.0 开发的。

服务器部分公开继承 ServicedComponent 类并返回实现"可序列化"属性的对象的服务。客户端通过组件的 COM+ 导出代理调用远程类。我们通过 ClickOnce 分发客户端应用,并且必须使用管理员权限将 COM+ 生成的代理安装到每台客户端计算机上。这是不好的一点。

因此,我们正在尝试评估其他技术,这些技术使我们能够消除此代理安装,但尚不清楚如何做到这一点。我们希望找到一种低影响的方法,允许我们使用相同的 COM+ 部分,并以某种方式将代理包含在客户端代码中。

我们尝试在客户端部分使用这样的代码,但仍需要 COM 注册。

Type comObjectType = Type.GetTypeFromProgID("SumNameSpace.SumClass", "servercomplus", true);
SumInterface comObject = Activator.CreateInstance(comObjectType) as SumInterface;

我们认为在客户端部分使用接口而不是类必须工作,但我们有一个例外:

Runtime.InteropServices.COMException (0x800401F3): Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))

如果 Windows 注册表中没有有关界面的正确信息,则应该会发生此错误,但我们不知道...

知道吗?

多谢

在不安装代理的情况下在 COM+ 中调用远程 .NET DLL

毫无疑问,您需要在所有客户端计算机上安装 COM+ 代理,并且您希望使用代理安装包进行安装。收到的错误是由于注册表中HKEY_CLASSES_ROOT配置单元下缺少 ProgID 条目造成的。除其他项外,此注册表项由安装包提供。这不是代理安装程序提供的全部内容;我在这里找到了一个很好的概述。

听起来您真正要寻找的是为您的 ClickOnce 部署创建自定义应用程序清单。这应该允许您将代理安装程序作为引导先决条件捆绑到 ClickOnce 部署中。但是,安装仍需要管理权限;我看不出解决这个问题的方法(见下面的注释(。这是一个工具的链接,该工具适用于由Stackoverflow用户Greg Jackman创建的ClickOnce清单。我对此没有任何经验,但根据 Grag 的帖子,看起来它可能对您有所帮助。

最后一点:即使您确实找到了以非提升用户身份运行安装包的方法,您也不想这样做。运行非提升将更改包与注册表交互的方式。短篇小说,它会默默地失败。

使用组策略分发组件?