Передача сборки по TCP

В настоящее время я пытаюсь отправить сериализованный объект через TCP-соединение следующим образом:

BinaryFormatter formatter = new BinaryFormatter();

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

где clientStream

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

Это отправляющая часть. Но может ли кто-нибудь сказать мне, как мне получить это на стороне клиента (т.е. десериализовать его на другом конце)?


person Pushkar    schedule 23.03.2009    source источник


Ответы (4)


Не сериализуйте сборку. Отправьте саму сборку, просто загрузив ее как файл и отправив эти байты другой стороне.

Затем, когда у обеих сторон будет одинаковый код, отправьте объект через сериализацию. Я считаю, что в AppDomain, который десериализует объект, должна быть загружена соответствующая сборка (или, по крайней мере, доступна для загрузки).

person Jon Skeet    schedule 23.03.2009

Вы пытаетесь передать по сети представление сборки в памяти, а не байты, составляющие сам файл сборки. Вы действительно хотите этим заниматься?

person Kent Boogaart    schedule 23.03.2009
comment
да. Но я предполагаю, что представление в памяти - это не вся сборка (с MSIL). Это правильно? - person Pushkar; 23.03.2009
comment
Да это верно. Если вы хотите передать .dll, вы должны открыть файл, прочитать его и отправить. И он еще не должен быть загружен программой передачи. - person Randolpho; 23.03.2009

Судя по комментариям, ответ совсем другой.

Вместо использования BinaryFormatter вы должны получить местоположение сборки через свойство Location, а затем использовать FileStream для чтения байтов сборки и отправки этого по сети.

Сериализация сборки не делает ничего, кроме отправки имени сборки. Вам необходимо отправить все содержимое сборки.

person casperOne    schedule 23.03.2009
comment
Но я предполагаю, что представление в памяти - это не вся сборка (с MSIL). Это правильно? - person Pushkar; 23.03.2009
comment
@Pushkar: Это зависит от того, какое представление в памяти? - person casperOne; 23.03.2009
comment
@Pushkar: Возникает вопрос, почему вы хотите отправить сборку по сети? - person casperOne; 23.03.2009
comment
@Casper - Я пытаюсь реализовать механизм Remote Entrusting, который перенаправляет мобильные модули для отправки на клиентские машины. Мы не можем отправить COMPLETE mobile EXE, поэтому решили отправить код - снова не можем отправить его в некомпилированном виде. Так что пришлось скомпилировать его в DLL и отправить. Думал со сборкой будет лучше. - person Pushkar; 23.03.2009
comment
@Pushkar: Изменен ответ на основе комментариев. - person casperOne; 23.03.2009

Попробуйте использовать BinaryWriter для записи в поток и BinaryReader для чтения из него.

person Migol    schedule 23.03.2009