Исключение: не удается найти сборку Mynamespace, версия =0.0.0.0, культура = нейтральная, PublicKeyToken= ноль
Я пытаюсь отправить объект изображения в виде сериализованного файла с клиента на сервер с помощью @TCP и получить это исключение
Код сервера
namespace Receiver
{
[Serializable()]
public class ImageSerial : ISerializable
{
public Image img = null;
public ImageSerial(SerializationInfo info, StreamingContext ctxt)
{
img = (Image)info.GetValue("OMG", typeof(Image));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("OMG", img);
}
}
public class ObjSerial
{
private Stream stream;
private BinaryFormatter bformatter;
private string FILENAME = "m.bin";
ImageSerial mp = new ImageSerial();
public Image getImgFromBin()
{
stream = File.Open(FILENAME, FileMode.Open);
bformatter = new BinaryFormatter();
mp = (ImageSerial)bformatter.Deserialize(stream);
stream.Close();
return mp.img;
}
Код клиента
namespace WindowsFormsApplication5
{
[Serializable()]
class ImageSerial :ISerializable
{
public Image img = null;
public ImageSerial() { }
public ImageSerial(SerializationInfo info, StreamingContext ctxt)
{
img = (Image)info.GetValue("OMG", typeof(Image));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("OMG",img);
}
}
public class ObjSerial
{
private string FILENAME = "m.bin";
private TcpClient tcpClient;
private FileStream fstFile;
private NetworkStream strRemote;
private string SERVERIP = "10.102.239.207";
private int SERVERPort = 5051;
public void start(Image ims)
{
ImageSerial mp = new ImageSerial();
mp.img = ims;
Stream stream = File.Open(FILENAME, FileMode.Create);
BinaryFormatter bformatter = new BinaryFormatter();
bformatter.Serialize(stream, mp);
stream.Close();
//Clear mp for further usage.
sendFile();
}
private void ConnectToServer(string ServerIP, int ServerPort)
{
tcpClient = new TcpClient();
try
{
tcpClient.Connect(ServerIP, ServerPort);
}
catch (Exception exMessage)
{
// Display any possible error
}
}
private void sendFile()
{
ConnectToServer(SERVERIP, SERVERPort);
if (tcpClient.Connected == false)
{
ConnectToServer(SERVERIP, SERVERPort);
}
strRemote = tcpClient.GetStream();
fstFile = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
int bytesSize = 0;
byte[] downBuffer = new byte[2048];
while ((bytesSize = fstFile.Read(downBuffer, 0, downBuffer.Length)) > 0)
{
strRemote.Write(downBuffer, 0, bytesSize);
}
tcpClient.Close();
strRemote.Close();
fstFile.Close();
}
}
Я прочитал много тем об этом исключении, и все они говорят о двух решениях
- formatter.Binder
- AppDomain.CurrentDomain.AssemblyResolve
но все равно не работает
1 ответ
Конечно, серверная сторона не найдет клиентскую сборку. И не должно. Ваш код на стороне клиента не должен находиться на стороне сервера. Проблема в том, что вы определили ImageSerial
Класс дважды, один на сервере и один на клиенте. Это совершенно неправильно, если вы контролируете обе стороны. Создайте общую сборку, на которую ссылаются как клиент, так и сервер, и поместите туда общие классы.
Также удалите все ссылки с сервера на клиент. Он должен быть связан другим способом, если вы хотите, или использовать промежуточный уровень обслуживания, такой как WCF.