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

时间:2012-05-04 09:24:16

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

我们有一个完全用.NET 4.0(C#)开发的三层应用程序。作为企业应用程序服务器,我们使用COM + 1.5(我知道它有点遗留......)。有一个服务器部分和一个客户端部分都是用C#for .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注册表中没有关于接口的正确信息,则会发生此错误,但我们不知道......

有什么想法吗?

非常感谢

2 个答案:

答案 0 :(得分:2)

毫无疑问,您需要在所有客户端计算机上安装COM +代理,并且您希望使用代理安装包进行安装。您获得的错误是注册表中HKEY_CLASSES_ROOT配置单元下缺少ProgID条目的结果。此注册表项由安装包提供。这不是代理安装程序提供的全部内容;我发现了很好的概述here

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

最后要注意的是:即使您确实找到了以非提升用户身份运行安装包的方法,您也不希望这样做。运行非提升将改变包与注册表交互的方式。简短的故事,它将无声地失败。

答案 1 :(得分:1)

使用组策略分发组件?