【问题标题】:Transferring Assembly over TCP通过 TCP 传输程序集
【发布时间】:2009-03-23 16:52:27
【问题描述】:

我目前正在尝试通过 TCP 连接发送序列化对象,如下所示 -

BinaryFormatter formatter = new BinaryFormatter();

        formatter.Serialize(clientStream, (Object)Assembly.LoadFrom("test.dll"));

clientStream 在哪里

TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

这是发送部分。但是谁能告诉我如何在客户端接收它(即在另一端反序列化它)?

【问题讨论】:

    标签: c# .net assemblies


    【解决方案1】:

    不要序列化程序集。只需将程序集作为文件加载并将这些字节发送到另一端即可发送程序集本身。

    然后,当双方的代码相同时,通过序列化发送对象。我相信反序列化对象的 AppDomain 必须加载相关的程序集(或至少可以加载)。

    【讨论】:

      【解决方案2】:

      您正在尝试通过线路传递程序集的内存中表示,而不是包含程序集文件本身的字节。这真的是你想做的吗?

      【讨论】:

      • 是的。但我猜在内存中表示不是整个程序集(使用 MSIL)。这是正确的吗?
      • 是的,没错。如果要传输 .dll,您必须打开文件,阅读并发送。并且它不能已经被传输程序加载。
      【解决方案3】:

      根据cmets,答案完全不同。

      您应该通过 Location 属性获取程序集的位置,而不是使用 BinaryFormatter,然后使用 FileStream 读取程序集的字节并通过线路发送

      序列化程序集只不过是发送程序集名称。您需要发送程序集的全部内容。

      【讨论】:

      • 但我猜内存中的表示不是整个程序集(使用 MSIL)。这是正确的吗?
      • @Pushkar:这取决于,内存中的表示是什么?
      • @Pushkar:这引出了一个问题,为什么要通过网络发送程序集?
      • @Casper - 我正在尝试实现远程委托机制,该机制将移动模块重新发送到客户端计算机。我们无法发送完整的移动 EXE,因此决定发送代码 - 再次无法发送未编译的代码。所以不得不把它编译成DLL并发送。认为装配会更好。
      • @Pushkar:根据 cmets 更改答案。
      【解决方案4】:

      尝试使用BinaryWriter 写入流,使用BinaryReader 读取流。

      【讨论】:

        猜你喜欢
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 2017-04-27
        • 2014-04-15
        • 1970-01-01
        相关资源
        最近更新 更多