需求是这样的:1、WinForm程序
2、多人开发,每人实现不同模块功能
3、整个项目和后台建立一个TCP连接,每个模块都要与后台TCP通讯现已做好和后台的TCP连接类,预想的架构是每个人开发一个UserControl,主程序加载UserControl时将TCP连接对象作为参数传入。这样的话主程序和每个模块程序都要有TCP连接类的定义(不同项目中TCP连接类的命名空间都相同),当要将TCP连接类对象作为参数传入时编译通不过,说不能转换改类型。尝试用Marshal.StructureToPtr后再传也不行,不知改怎么弄了,请高人指教。也许我这个架构本身有问题,该怎么改比较好呢?tcpwinform通讯架构

解决方案 »

  1.   

    TCP连接类是啥?贴点代码出来撒。
      

  2.   

    你的TCP连接对象说得太笼统,如果是一个封装有tcpclient之类的自定义类,各模块直接引用通信模块就可以了,这种应用很常见。但说得简单,实现通信模块并不容易,比如要考虑多线程问题,可能需要建立通信队列等等。
      

  3.   


    实际TCP连接是C++写的COM实现的(多线程,异步,也有通信队列),C#那个类(简称A类吧)仅仅是应用层对数据的组包和分包实现,以及接收COM的回调事件,然后传递给界面线程。A类中定义了一个COM的对象,然后就是定义了一些需要分包组包用到的变量,有HashTable、Dictionary、数组等。但程序的开发已经实现了,现在是在这个程序中要加入其它相似的模块,又要多人同时开发,所以想了分别开发UserControl这个架构,不知是否合理,希望大家能给我点思路。
      

  4.   

    而且我的想法是每个人的UserControl编译成dll供主程序调用,而不是代码和主程序代码一块编译,这样方便日后的升级
      

  5.   


    不会每个模块都定义了一个类吧,只需要在一个dll的工程中定义一次即可。其它工程引用这个工程。
      

  6.   


    主要是主程序也要用到这个类,现在挠头的就是如何共用类。C++中有头文件,C#中好像类声明和类实现无法分开,可看微软的函数定义(比如定位Control的某些函数),看到的也只有类的函数声明,没有实现部分,也不是Partial类,不知是怎么弄的。你倒是提醒了我,我可以将共用类单独提出来写成一个dll,主程序、各模块程序直接引用即可,这样应该可行。
      

  7.   


    对头。 C#不需要.h文件,应为assembly是自描述的。直接饮用assembly就可以。
      

  8.   

    引用同一个dll就可以了,没必要传什么参数
      

  9.   

    个人见解我觉得应该定义一个共用类,让这个类和TCP进行通讯,然后各个模块引用这个类,那么所有的通讯内容的转化都应该在这个类中进行处理
      

  10.   

    如下建议:1.TCP连接对象  ——  这类可能操作硬件通讯的 类,个人觉得 不要进行封装传递 比较好;
         你可以 将 IP地址,端口  等信息 封装传递,在统一的地方  重建 “TCP连接对象”;2.Marshal  看到这个单词,我敏感的觉得:序列化 可能得注意点啥子;
    3.“而且我的想法是每个人的UserControl编译成dll供主程序调用,而不是代码和主程序代码一块编译,这样方便日后的升级”——是否 UserControl  有统一的接口?  插件式程序扩展升级  都以接口的标准。
    4.Re "g767160":这个答案 很标准——这类似 一种命令模式,将需要执行的 过程和返回值 封装成一个对象,统一调用 某些对象 处理;——————————————————————————————————————
    以上回答,并没有完全针对楼主的 BUG;
    只是觉得 假如是自己的话,自己可能得注意哪些要点。
      

  11.   

    为端对开发人员定义一个UC基类,成员定义UC时均继承于基类,主窗体只管基类就行,不过问其他细节
      

  12.   


    谢谢!1.TCP连接对象  ——  这类可能操作硬件通讯的 类,个人觉得 不要进行封装传递 比较好;
         你可以 将 IP地址,端口  等信息 封装传递,在统一的地方  重建 “TCP连接对象”;
    不行的,主程序建立连接后,只能其他模块共用。这个类是单例模式,同一进程中不同模块(dll)用这个类,不知是否还是单例,回头验证下2.Marshal  看到这个单词,我敏感的觉得:序列化 可能得注意点啥子; 
    是的,这块我还没深究,肯定是某些类变量不能被序列化,比如那个COM组件对象3.“而且我的想法是每个人的UserControl编译成dll供主程序调用,而不是代码和主程序代码一块编译,这样方便日后的升级”——是否 UserControl  有统一的接口?  插件式程序扩展升级  都以接口的标准。
    没错,肯定会有一个标准接口,还有统一的基类各模块的UserControl必须继承4.Re "g767160":这个答案 很标准——这类似 一种命令模式,将需要执行的 过程和返回值 封装成一个对象,统一调用 某些对象 处理;
    9楼findcaiyzh的回答已让我想到了这一点,应该是个可行的方案。谢谢你们的进一步确认
      

  13.   

    问题解决!将共用类打包成一个类库dll,各UC库引用该dll就ok