Писал как-то приложение для распределенных вычислений, у меня сборка, выполняющая атомарную задачу (она реализовывалась как плагин, позволяя, реализовав в сборке интерфейс, выполнять любую задачу), загружалась с клиента-заказчика вычислений на клиенты исполнители вместе с исходными данными задач. Так вот, сборку я передавал просто как массив байтов (просто считывал файл с диска), этот массив был частью информации о задаче (для связи использовался Remoting). На выполняющем клиенте сборка воссоздавалась из этого массива при помощи Assembly.Load .
... << RSDN@Home 1.2.0 alpha rev. 0>>
и еще. Сериализовать сборку для ее восстановления на другой маши не получится. Ведь сериализация — это не способ хранения данных, это способ сохранения _состояния_ объекта. Когда сборка (точнее, интерфейс к ней в виде объекта 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>>
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
ссылка на оригинальное сообщение