none
请教C#下out-of-process COM服务器的完整实现示例或更好的解决办法 RRS feed

  • 问题

  • 实际情况:
          公司项目中有一个C#的服务器程序(其实是整个服务器的一部分),要求带winform界面,对外公布webservice接口,对内需要通过TCP Socket访问服务器的另外一个程序。

    我的理解:
          对内通过TCP Socket访问服务器的另外一个程序容易实现,关键就是对外如何提供webservice接口。
    我想到的解决办法是:做成带winform的out-of-process类型的COM服务器程序(EXE形式),再做一个in-of-process的COM(DLL形式),DLL形式的程序部署在本机上,调用EXE形式的out-of-process类型的COM服务器程序,然后,再做webservice,在webservice种调用DLL形式的COM。这样,外部只需要知道Webservice地址就可以访问了。

    疑惑:
    1、网上找的资料都是关于如何制作in-of-process的COM服务器,都是DLL形式的,带winform的out-of-process类型的COM服务器程序(EXE形式)资料很少,到目前为止,我还没完成EXE形式的COM服务器程序
    2、这种方式,我以前在D6里实现过,并且一直这么用着,感觉还可以,但现在在.Net下了,是不是有更好的方式?

    说明一下:我在.net下还想用webservice调用COM的这种形式,主要是想利用COM的事务以及并发控制。

    请大侠们帮忙,最好有示例,万分感激!
    这几天搞得头都大了,呵呵
    2009年3月30日 10:36

答案

  • Hi,
    你的问题我前几天注意了,但是今天才仔细看。
    你描述的问题我接触过,进程外托管Web Service,这个代码确实现在难找。
    我可以给你提供一些解决问题建议和如何查找资料:
    1.你描述的问题和解决方法。我没记错的话,属于WSE的内容,在微软的WSE3.0相关的技术文章里可以查找的到。
    现在的WCF托管宿主方式很多,很大程度上参考WSE3.0。WSE3.0其中就对托管Web Service提供了扩展,支持多种宿主类型。wcf以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host),这个和WSE很相似.
    2.WSE.示例代码里,有多种自定义宿主托管Web Service的示例,而你想要Windows Forms托管,只是界面不同,核心代码有参考价值。
    3.WSE 3.0下载地址。下载并安装WSE 3.0,你可以选择安装Tools和Samples,开发环境选择Visual Studio 2005插件方式,开发过程中配置Web服务WSE 3.0特性会比较方便。
    4.我整理过WSE3.0相关的技术文章。WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发 ,你也可以参考一下里面有具体的安装WSE3.0的描述。这个SDK的下载和安装都有详细的描述。
      
       有问题可以继续交流~希望我的回答有助于对你问题的解决~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月19日 5:01
    版主
  • 看你的意思,你是想在你的winform程序中host webservice.
    那我告诉你,最简单的方式就是用wcf来做你的webservice,wcf可以很方便的host在.exe中.

    如果你不这么做,老徐介绍那个方案,我没看过,不过应该可行,就是麻烦点.

    .net本身只支持进程内com组件,也就是进程内激活com,如果非要实现进程外com,那么你需要自己制作一个
    com server,使用com server来激活com组件。这样的代价很高,实际上就是写个类似wcf的host.

    com+主要用于分布式架构,这个是需要创建代理桩子的。在.net 使用remoting可以完全替代com+的功能。

    com/com+本身是没法实现webservice接口的,跨机器的访问都是使用socket访问。

    如果你是问ATL的问题,个人可以解答你很多关于com/com+/dcom方面的难题,
    然而你问的是.net,所以我不得不推荐你选用wcf的方案,你的问题用wcf解决起来,超级简单。
    2009年11月3日 13:51

全部回复

  • 你好!
         我感觉不需要用到COM就可以实现了啊!单纯使用.NET就可以很好的实现这样的需求了!
         .NET下关于事务和并发都有很好的模型和类可以使用啊!
    周雪峰
    2009年3月30日 10:52
    版主
  • 您好,感谢你的回复

    我不只是想利用COM的事务和并发。

    我发现我上面说了这么一大段,没说清楚我的需求,呵呵。

    简单的说,我现在要做一个EXE类型的服务器程序,这个EXE能够提供带事务和并发功能的WebService接口。

    以前在delphi中我们是这样实现的:WebService与COM+部署在同一台电脑上,Webservice调用本地的COM+接口,COM+接口不完

    成任何的业务功能,只是调用从EXE中导出的.tlb中提供的接口

    我不知道我有没有说明白
    2009年3月30日 11:32
  • Hi,
    你的问题我前几天注意了,但是今天才仔细看。
    你描述的问题我接触过,进程外托管Web Service,这个代码确实现在难找。
    我可以给你提供一些解决问题建议和如何查找资料:
    1.你描述的问题和解决方法。我没记错的话,属于WSE的内容,在微软的WSE3.0相关的技术文章里可以查找的到。
    现在的WCF托管宿主方式很多,很大程度上参考WSE3.0。WSE3.0其中就对托管Web Service提供了扩展,支持多种宿主类型。wcf以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host),这个和WSE很相似.
    2.WSE.示例代码里,有多种自定义宿主托管Web Service的示例,而你想要Windows Forms托管,只是界面不同,核心代码有参考价值。
    3.WSE 3.0下载地址。下载并安装WSE 3.0,你可以选择安装Tools和Samples,开发环境选择Visual Studio 2005插件方式,开发过程中配置Web服务WSE 3.0特性会比较方便。
    4.我整理过WSE3.0相关的技术文章。WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发 ,你也可以参考一下里面有具体的安装WSE3.0的描述。这个SDK的下载和安装都有详细的描述。
      
       有问题可以继续交流~希望我的回答有助于对你问题的解决~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月19日 5:01
    版主
  • 看你的意思,你是想在你的winform程序中host webservice.
    那我告诉你,最简单的方式就是用wcf来做你的webservice,wcf可以很方便的host在.exe中.

    如果你不这么做,老徐介绍那个方案,我没看过,不过应该可行,就是麻烦点.

    .net本身只支持进程内com组件,也就是进程内激活com,如果非要实现进程外com,那么你需要自己制作一个
    com server,使用com server来激活com组件。这样的代价很高,实际上就是写个类似wcf的host.

    com+主要用于分布式架构,这个是需要创建代理桩子的。在.net 使用remoting可以完全替代com+的功能。

    com/com+本身是没法实现webservice接口的,跨机器的访问都是使用socket访问。

    如果你是问ATL的问题,个人可以解答你很多关于com/com+/dcom方面的难题,
    然而你问的是.net,所以我不得不推荐你选用wcf的方案,你的问题用wcf解决起来,超级简单。
    2009年11月3日 13:51