【问题标题】:Calling a remote .NET DLL inside COM+ without the proxy installation在不安装代理的情况下在 COM+ 中调用远程 .NET DLL
【发布时间】:2012-05-13 20:09:02
【问题描述】:

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

服务器部分公开继承 ServicedComponent 类的服务并返回实现“Serializable”属性的对象。客户端通过组件的 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 注册表中没有关于接口的正确信息,应该会发生此错误,但我们不知道...

有什么想法吗?

非常感谢

【问题讨论】:

  • 您检查过潜在的 32/64 位问题吗?
  • 我在 32 位 Windows VISTA 上尝试过,但出现同样的错误! tnx
  • 可以用免注册的COM:msdn.microsoft.com/en-us/library/ms973913.aspx吗?
  • 它似乎不适用于本机程序集 COM。它仅适用于具有独立属性的 ActiveX COM……但我不确定。如果有人有一个用 .NET 开发的客户端的示例,希望使用用 .NET 代码开发的 COM,那就更好了!

标签: c# .net com com-interop com+


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复,但我记得可以在注册表的 HKCU 路径中“模拟”的 HKLC 注册表部分。它与无 REG 的 COM 模式有关……看看这个 URL:msdn.microsoft.com/en-us/magazine/cc188708.aspx 但可能我混合了不同的东西……我不敢相信微软没有考虑在 ClickOnce 过程中集成 COM+ 代理。唯一的一种解释可能是它是遗留的,不再受支持
  • 还有一点是:为什么我只使用接口时需要在注册表中有CLSID?
  • 因为 Activator 使用 COM 来实例化对象,而 COM 必须在注册表中查找 ProgID SumNameSpace.SumClass 的 COM 服务器二进制文件(通过 ClassID,它也在注册表中)跨度>
  • 关于 HKCL 仿真,您是正确的,但我试图保持答案简单(ish)。这与为什么您无法正确注册组件有关,除非您正在运行提升。通过免费注册的 COM 使用代理有点麻烦,因为代理还有其他依赖项。
  • Paul 你有我可以使用的 HKCL 仿真的工作示例吗?
【解决方案2】:

使用组策略分发组件?

【讨论】:

  • 我们使用分发产品来部署代理组件,但我们更愿意将代理部分包含在客户端应用程序中,并使用 ClickOnce 进行整体部署
  • Ben 我刚看到你的分数……你可能已经知道答案了,我们走吧! :)
  • @robob,如果您已经有了分发组件的方法 - 请继续使用它!无论如何,这是我的建议。
  • 我们想改变它,因为部署时机对我们来说非常重要。因此,我们希望为每个客户端部分使用 ClickOnce 部署功能。我确定有一种方法可以将代理部分集成到客户端部分......谢谢您的回复。我想我为这个问题开始赏金
  • 如果您能够使用 ClickOnce 分发 DLL,您可能可以在启动时使用 P/Invoke 调用 DllRegisterServer 来注册它。
猜你喜欢
  • 2011-12-29
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多