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

Тема в разделе ".NET", создана пользователем opozdaika, 21 май 2009.

  1. opozdaika

    opozdaika Гость

    Репутация:
    0
    В приложении с использованием технологи 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.

    Код (Text):
    //-------------------------------------------------------------
    //СЕРВЕР
    //-------------------------------------------------------------
    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 вроде работает.

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

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

    opozdaika Гость

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

    opozdaika Гость

    Репутация:
    0
    Сообщаю дополнительные сведения об ошибке "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
    Кто скомпилирует под Вистой - увидит сам.
     
  4. etc

    etc Гость

    Репутация:
    0
    Зачем вам Remotingб берите WCF, с ним тоже хватает плясок, но они смешнее.
     
  5. opozdaika

    opozdaika Гость

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

    opozdaika Гость

    Репутация:
    0
    А кстати, да. Вот, попробовал WCF. Достойная альтернатива ремоутингу.
     
  7. etc

    etc Гость

    Репутация:
    0
    Это не альтернатива, это замена.
     
  8. opozdaika

    opozdaika Гость

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

    etc Гость

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

Поделиться этой страницей