Задача - переслать сборку .NET по сети.
От: nicolay.pankov  
Дата: 29.11.05 14:36
Оценка:
Напомню:
[Serializable]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Assembly : IEvidenceFactory, ICustomAttributeProvider, ISerializable

Вот код сериалазации:
Assembly a = Assembly.LoadFrom("C:\SomeAssembly.dll");
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream("assembly.dat", FileMode.Create);
formatter.Serialize(stream, a);
stream.Close();

Далее пытаемся десериализовать все это:
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream("assembly.dat", FileMode.Open);
Assembly a = (Assembly)formatter.Deserialize(stream);

При десериализации происходит исключение:
An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll
Additional information: Insufficient state to deserialize the object. More information is needed.

Что можно с этим сделать?
Re: Задача - переслать сборку .NET по сети.
От: sich Украина  
Дата: 29.11.05 14:49
Оценка:
Писал как-то приложение для распределенных вычислений, у меня сборка, выполняющая атомарную задачу (она реализовывалась как плагин, позволяя, реализовав в сборке интерфейс, выполнять любую задачу), загружалась с клиента-заказчика вычислений на клиенты исполнители вместе с исходными данными задач. Так вот, сборку я передавал просто как массив байтов (просто считывал файл с диска), этот массив был частью информации о задаче (для связи использовался Remoting). На выполняющем клиенте сборка воссоздавалась из этого массива при помощи Assembly.Load .
... << RSDN@Home 1.2.0 alpha rev. 0>>
Задача - переслать сборку .NET по сети.
От: Аноним  
Дата: 29.11.05 15:23
Оценка:
use System.Net.Sockets.TcpClient...
MSDN wrote:
TcpClient tcpClient = new TcpClient ();
// Uses the GetStream public method to return the NetworkStream.
NetworkStream netStream = tcpClient.GetStream ();

if (netStream.CanWrite)
{
Byte[] sendBytes = Encoding.UTF8.GetBytes ("Is anybody there?");
netStream.Write (sendBytes, 0, sendBytes.Length);
}
else
{
Console.WriteLine ("You cannot write data to this stream.");
tcpClient.Close ();

// Closing the tcpClient instance does not close the network stream.
netStream.Close ();
return;
}

if (netStream.CanRead)
{
// Reads NetworkStream into a byte buffer.
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];

// Read can return anything from 0 to numBytesToRead.
// This method blocks until at least one byte is read.
netStream.Read (bytes, 0, (int)tcpClient.ReceiveBufferSize);

// Returns the data received from the host to the console.
string returndata = Encoding.UTF8.GetString (bytes);

Console.WriteLine ("This is what the host returned to you: " + returndata);
}
else
{
Console.WriteLine ("You cannot read data from this stream.");
tcpClient.Close ();

// Closing the tcpClient instance does not close the network stream.
netStream.Close ();
return;
}



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Задача - переслать сборку .NET по сети.
От: sich Украина  
Дата: 29.11.05 15:47
Оценка:
и еще. Сериализовать сборку для ее восстановления на другой маши не получится. Ведь сериализация — это не способ хранения данных, это способ сохранения _состояния_ объекта. Когда сборка (точнее, интерфейс к ней в виде объекта Assembly)сериализуется, сохраняется только информация о состоянии этого объекта. Для десериализации этого объекта все равно потребуется эта самая сборка.

а вот откопал свой код для передачи сборки (тут предполагается, что там, где сборка будет загружаться, все сборки, на которые она ссылается, будут присутствовать):

using System;
using System.Reflection;
using System.IO;
//////////////////////////////////////////////////////////////////////////
namespace DistributedProcessing
{
    [Serializable]
    public class TransitAssembly
    {
        [Serializable]
            struct AsmFile
        {
            public String    sFileName;
            public Byte[]    arFileData;
        }

        public TransitAssembly(Assembly asm)
        {
        
            AssemblyFiles  = new AsmFile[asm.GetFiles().Length];

            int i = 0;
            
            foreach(FileStream fs in  asm.GetFiles())
            {
                AssemblyFiles[i].sFileName  = Path.GetFileName(fs.Name);
                AssemblyFiles[i].arFileData = new byte[(int) fs.Length];
                
                fs.Read(AssemblyFiles[i].arFileData, 0, AssemblyFiles[i].arFileData.Length);
                fs.Close();
                i++;
            }
            
            
        }

        public Assembly LoadInCurrDomain()
        {
            return Assembly.Load(AssemblyFiles[0].arFileData);
        }

        public Assembly LoadInDomain(AppDomain Domain)
        {
            return Domain.Load(AssemblyFiles[0].arFileData);
        }

        public void Save()
        {
            Save("");
        }

        public void Save(String path)
        {
            foreach(AsmFile af in  AssemblyFiles)
            {
                FileStream fs = new FileStream(
                    path + af.sFileName , FileMode.Create, 
                    FileAccess.Write, FileShare.Write );

                fs.Write(af.arFileData, 0, af.arFileData.Length);
                fs.Close();
                
            }
            
        }

        
        private AsmFile[]    AssemblyFiles; 
        
    }

    
}
//////////////////////////////////////////////////////////////////////////
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re: Задача - переслать сборку .NET по сети.
От: Igor Trofimov  
Дата: 29.11.05 20:49
Оценка:
Ну, прямо так не получится, а вот взять файл сборки и его переслать — это спокойно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.