Remoting: Argumentnullexception в Copytomanaged, нулевой параметр &quo

  • Автор темы opozdaika
  • Дата начала
O

opozdaika

В приложении с использованием технологи Remoting по TCP каналу возникает исключение, которое невозможно отладить. Просто возникает окно и ничего с ним сделать нельзя, в каком месте кода - не показывает.

А имено: 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)
------------------------------------------------

КОД (я убрал все что можно, оставил только примитивный ремоутинг по TCP)
Есть три сборки: Сервер, Клиент и Объект связи. Этот объект я делал сначала в одной сборке с сервером, потом вылелил в одтельную сборку - ни на что это не влияет.
Работает так. Запускаю MyServer.exe, затем запускаю MyClient.exe Пока нормально. Затем я закрываю MyClient.exe и запускаю его еще раз. И тут приходит ArgumentNullException.

Код:
//-------------------------------------------------------------
//СЕРВЕР
//-------------------------------------------------------------
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. На канале IPC вместо TCP вроде работает.

В описании исключения содержится намек на использование какого-то неуправляемого кода. (?)

Буду благодарен за любую информацию как найти ошибку. Скорее всего где-то у меня потоки криво написаны.
Спасибо.
 
O

opozdaika

Помогите же! Какие бы примеры из сети я ни брал на тему ремоутинга по TCP, на каком бы компьютере ни запускал (XP, Vista), какую бы версию FrameWork ни использовал (от 2.0 до 3.5) - всё всегда кончается отдим и тем же: ArgumentNullException в CopyToManaged!!!!
 
O

opozdaika

Сообщаю дополнительные сведения об ошибке "ArgumentNullException в CopyToManaged"
1. Ошибка проявляется только на MS Vista включая SP1 и SP2. На XP и на Windows 7 работает НОРМАЛЬНО
2. Ошибка проявляется только при использовании канала TCP. На канале IPC работает НОРМАЛЬНО
3. Некоторые примеры (особенно в виде консольного приложения) проявляют ошибку по-другому: первое обращение к серверу зависает, последующие проходят нормальрно.
4. Общим является то, что ПЕРВОЕ обращение и ПОСЛЕДУЮЩИЕ происходят по-разному. То есть:
-Либо при первом обращении ОК, при втором ArgumentNullException
-Либо при первом обращении - тишина, при втором и последующих - ОК
5. Желающие могут попробовать. Вот ссылка на классический пример (внизу страницы) от самой Microsoft:

Кто скомпилирует под Вистой - увидит сам.
 
E

etc

Зачем вам Remotingб берите WCF, с ним тоже хватает плясок, но они смешнее.
 
O

opozdaika

Короче, ногострадальная проблема резрешилась!!!
Виновник - клиент ИСА (MS Firewall Client for ISA Server v 4.0)
Он у нас на всех машинах, поэтому падало везде. Но только на Висте.
Как же так? MS Remoting конфликтует с MS Firewall на MS Vista?
 
O

opozdaika

Все, сделал рабочий образец на WCF. Все работает как часы. Клиенты легко подписываются на события сервера (в Ремоутинге это делалось четез делегаты, причем я должен был класть копию client.exe на машину-сервер в папку, откуда запускается server.exe - бред). На последок провел эксперемент. Поставил назад ISA Client на висту. И что вы думаете? WCF свалился в точности, как и ремоутинг (см сабж) !!! Короче, ISA Client масдай :D
 
E

etc

Надо смотреть все ли правильно настроено, и в ИСА и в ВЦФ, и т.д.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!