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

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

  1. opozdaika

    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.

    Код (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 Гость

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

    opozdaika Гость

    Сообщаю дополнительные сведения об ошибке "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 Гость

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

    opozdaika Гость

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

    opozdaika Гость

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

    etc Гость

    Это не альтернатива, это замена.
     
  8. opozdaika

    opozdaika Гость

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

    etc Гость

    Надо смотреть все ли правильно настроено, и в ИСА и в ВЦФ, и т.д.
     

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