2012-05-04 70 views
0

我们有一个完全在.NET 4.0(C#)中开发的三层应用程序。作为企业应用服务器,我们使用COM + 1.5(我知道这有点遗憾......)。在C#中为.NET 4.0开发了一个服务器部分和一个客户端部分。在没有代理安装的情况下调用COM +中的远程.NET DLL

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

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

我们试图在客户端部分使用这样的代码,但仍需要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注册表中的界面,但我们不知道...

任何想法?

非常感谢

+0

您是否检查过潜在的32/64位问题? –

+0

我已经尝试了32位Windows VISTA,并有同样的错误! tnx – robob

+0

您可以使用免注册的COM:http://msdn.microsoft.com/en-us/library/ms973913.aspx? –

回答

2

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

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

最后一个注意事项:即使您确实找到了以非升级用户身份运行安装软件包的方法,您也不希望这样做。运行非提升会改变程序包与注册表的交互方式。短篇小说,它会默默地失败。

+0

感谢您的回复,但我记得一些关于HKLC注册表部分的内容,可以在注册表的HKCU路径中“模拟”。它与无REG的COM模式有关...看看这个网址:http://msdn.microsoft.com/en-us/magazine/cc188708.aspx 但是可能我混合了不同的东西..我不能相信微软在ClickOnce流程中没有考虑COM +代理整合。唯一的解释可能是它的遗留问题,并且不再受支持 – robob

+0

另一个问题是:为什么当我仅使用接口时,需要在注册表中使用CLSID? – robob

+0

由于Activator使用COM实例化对象,并且COM必须在注册表中查找ProgID SumNameSpace.SumClass的COM服务器二进制文件(通过ClassID,它也在注册表中) –

1

使用组策略分配组件?

+0

我们使用分发产品来部署代理组件,但我们更愿意将代理部分包含到客户端应用程序中,并使用ClickOnce部署整个部分 – robob

+0

Ben我刚刚看到您的分数......可能您知道答案,所以我们走吧! :) – robob

+0

@robob,如果你已经有一种方法来分发组件 - 只需继续使用它!无论如何,这是我的建议。 – Ben

相关问题