//-------------------------------------------------------------
//СЕРВЕР
//-------------------------------------------------------------
using System;
using System.Windows.Forms;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using MyCommunication;
namespace MyServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; // All callers receive complete exception information.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
System.Collections.IDictionary props = new System.Collections.Hashtable();
props["port"] = 1206;
TcpChannel RemotingChannel = new TcpChannel(props, null, provider);
ChannelServices.RegisterChannel(RemotingChannel, false);
// Expose an object for remote calls.
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Communication), "BlaBlaBla", WellKnownObjectMode.Singleton);
}
}
}
//------------------------------------------------------------
//КОМУНИКАЦИОННЫЙ Объект (даже сделал в отдельной сборек)
//------------------------------------------------------------
using System;
namespace MyCommunication
{
public interface ICommunication
{
int Version { get; } // Номер версии реализации
}
//Объект для ремоутинга
public class Communication : MarshalByRefObject, ICommunication
{
public int Version
{
get { return 101; }
}
}
}
//------------------------------------------------------------
//КЛИЕНТ
//------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using MyCommunication;
namespace MyClient
{
public partial class fMain : Form
{
public fMain()
{
InitializeComponent();
}
private void fMain_Load(object sender, EventArgs e)
{
ICommunication ConfiguratorCom = (ICommunication)Activator.GetObject(typeof(ICommunication), "tcp://localhost:1206/BlaBlaBla");
int v = ConfiguratorCom.Version;
}
}
}
ArgumentNullException в CopyToManaged - нулевой параметр "source"
А имено: ArgumentNullException в системной функции CopyToManaged. Ей передается нулевой параметр "source".
Ниже детали исключения:
------------------------------------------------
System.ArgumentNullException was unhandled
Message="Значение не может быть неопределенным.\r\nИмя параметра: source"
Source="mscorlib"
ParamName="source"
StackTrace:
в System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object destination, Int32 startIndex, Int32 length)
в System.Net.Sockets.AcceptOverlappedAsyncResult.PostCompletion(Int32 numBytes)
в System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
в System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
------------------------------------------------
Буду благодарен за любую информацию как найти ошибку. Скорее всего где-то у меня потоки криво написаны.
Спасибо.
Покажите код. По трассировке стека трудно сказать в чем ошибка.... возможно с того конца как-то неправильно записываются данные.
Есть три сборки: Сервер, Клиент и Объект связи. Этот объект я делал сначала в
одной сборке с сервером, потом вылелил в одтельную сборку - ни на что это не
влияет.
Работает так. Запускаю MyServer.exe, затем запускаю MyClient.exe Пока нормально.
Затем я закрываю MyClient.exe и запускаю его еще раз. И тут приходит
ArgumentNullException.
FrameWork 2.0 Windows Vista
Код:
Помогите же! Какие бы примеры из сети я ни брал на тему ремоутинга по TCP, на каком бы компьютере ни запускал (XP, Vista), какую бы версию FrameWork ни использовал (от 2.0 до 3.5) - всё всегда кончается отдим и тем же: ArgumentNullException в CopyToManaged!!!!
1. Ошибка проявляется только на MS Vista включая SP1 и SP2. На XP и на Windows 7 работает НОРМАЛЬНО
2. Ошибка проявляется только при использовании канала TCP. На канале IPC работает НОРМАЛЬНО
3. Некоторые примеры (особенно в виде консольного приложения) проявляют ошибку по-другому: первое обращение к серверу зависает, последующие проходят нормальрно.
4. Общим является то, что ПЕРВОЕ обращение и ПОСЛЕДУЮЩИЕ происходят по-разному. То есть:
-Либо при первом обращении ОК, при втором ArgumentNullException
-Либо при первом обращении - тишина, при втором и последующих - ОК
5. Желающие могут попробовать. Вот ссылка на классический пример (причем довольно старый) от самой Microsoft:
http://msdn.microsoft.com/en-us/library/ms973857.aspx
Кто скомпилирует под Вистой - увидит сам.
Виновник - клиент ИСА (MS Firewall Client for ISA Server v 4.0)
Он у нас на всех машинах, поэтому падало везде. Но только на Висте.
Как же так? MS Remoting конфликтует с MS Firewall на MS Vista?
PS. И кстати, WCF (замена ремоутинга) тоже валится на висте в присутствии ISA Client