Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > ArgumentNullException в CopyToManaged


Автор: opozdaika 15.5.2009, 18:17
В многопоночном приложении с использованием технологи 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)
------------------------------------------------

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

Автор: opozdaika 20.5.2009, 13:17
Вот глядите, убрал все что можно. Оставил только примитивный ремоутинг по 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;
        }
    }
}

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

Автор: opozdaika 7.7.2009, 14:07
Сообщаю дополнительные сведения об ошибке "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
Кто скомпилирует под Вистой - увидит сам.

Автор: PashaPash 7.7.2009, 16:20
opozdaika, взял твой пример, вбил в студию, запустил под 2008-м сервером - та же виста - все работает. В примере аттач с исходниками и с бинарниками. Позапускай их.  С некоторой вероятностью у тебя просто битый инсталл висты. UAC включен/выключен? Firewall? Windows Defender? Порт менять пробовал на другой?

ЗЫ Если у тебя что-то "не работает" - ататч полные исходники, а не только текст cs. Всем лень тратить пол часа на разбирательство с чужой проблемой. Тем более что Steve Maine уже потратил - и не смог воспроизвести.

Автор: opozdaika 7.7.2009, 18:50
To PashaPash:
Цитата
opozdaika, взял твой пример, вбил в студию, запустил под 2008-м сервером - та же виста - все работает. В примере аттач с исходниками и с бинарниками. Позапускай их.  

Спасибо большое. Твои примеры ведут себя на моем компе точно так же, как и мои примеры. На втором компе с Вистой - точно то же. Твой консольнрый пример ведет себя по типу Б (первый раз виснет), оконный пример - по тпиу А (второй раз валится)
Цитата
С некоторой вероятностью у тебя просто битый инсталл висты. 

Виста фирменная, лицензионная. Но гарантийный срок прошел, поэтому в техподдержку я обратиться не могу.
Причем интегрирован был SP1, затем я обновился до SP2. Горячие обновления тоже включены
Цитата
UAC включен/выключен? 

Включен. Попробую отключить, но надежды мало
Цитата
Firewall? 

Пробовал и так и так
Цитата
Windows Defender? 

Его у меня нет
Цитата
Порт менять пробовал на другой?

пробовал
Цитата
ЗЫ Если у тебя что-то "не работает" - ататч полные исходники, а не только текст cs. Всем лень тратить пол часа на разбирательство с чужой проблемой. 

Прости, не знал, что здесь так принято
Цитата
Тем более что Steve Maine уже потратил - и не смог воспроизвести.

Ты и там побывал smile

Автор: PashaPash 7.7.2009, 19:37
Цитата(opozdaika @  7.7.2009,  18:50 Найти цитируемый пост)
Прости, не знал, что здесь так принято

Зачем сразу "принято" - просто так подсказывает здравый смысл smile
Доберусь вечером до домашней висты, проверю.
UPD: у меня в коде System.Net.Sockets.AcceptOverlappedAsyncResult.PostCompletion(Int32 numBytes) вызова System.Runtime.InteropServices.Marshal.CopyToManaged вообще нет. Проверь что .net пропатчен до упора. Поставь 3.5 SP1, и апдейты к нему.

Автор: PashaPash 8.7.2009, 13:09
Проверил на Vista SP1 + .NET 3.5 SP1. Не повторяется. Скорее всего дело в драйверах/железе/специфических настройках. Попробуй скачать 30-дневную виртуалку-триал (http://www.microsoft.com/downloads/details.aspx?familyid=C2C27337-D4D1-4B9B-926D-86493C7DA1AA&displaylang=en), и проверить под ней.

Автор: opozdaika 8.7.2009, 16:55
To PashaPash :

Цитата(PashaPash @ 8.7.2009,  13:09)
Проверь что .net пропатчен до упора. Поставь 3.5 SP1, и апдейты к нему.

Скажи пожалуйста, а те экзешники, которые ты выложил, они под какой фреймворк? Как я понимаю, как раз под 3.5 SP1?  А если скомпилируешь под 2.0? Ведь на момент выхода майкросовтовского примера, который мы по существу и компилируем, сущестовал пожалуй только 1.1
Я сейчас не компилирую сам, а тестирую на твоих бинарнкиах, как полученных на независимой стороне.  Есть ли мне в таком случае смысл апгрейдить фреймворк? И где взять последнее обновление?
Цитата
Проверил на Vista SP1 + .NET 3.5 SP1. Не повторяется.

Твои экзешники у меня падают, причем на двух вистах с РАЗНЫХ дистрибутивов. 
Цитата
Попробуй скачать 30-дневную виртуалку-триал

Буду сегодня и завтра пробовать различные дистрибутивы висты на тестовой машине. И сразу после установки висты буду запускать твой пример.

Спасибо за помощь!

To All
Был бы благодарен, если бы кто-то еще просто запустил два файла у себя на висте. Просто посмотреть, будет валиться или нет. 
1. Берешь zip-архив от PashaPash (см. его пост чуть ниже)
2. Из архива вытаскиваешь папку RemotingTest\Binaries к себе на винт
3. Запускаешь файл WindowsFormsServer.exe - появляется голое окно (это сервер)
4. Запускаешь файл WindowsFormsClient.exe  - появляется еще одно голое окно (это клиент)
5. Ждешь секунд 5, потом закрываешь клиентское окно. Пока все нормально
6. Ждешь еще секунд 5, запускаешь  WindowsFormsClient.exe во второй раз. Вот тут-то и наступает момент истины. Два окна либо спокойненько продолжают быть на экране, либо оба очень сильно обижаются.

Спасибо.

Автор: PashaPash 8.7.2009, 18:15
Цитата(opozdaika @  8.7.2009,  16:55 Найти цитируемый пост)
Скажи пожалуйста, а те экзешники, которые ты выложил, они под какой фреймворк? Как я понимаю, как раз под 3.5 SP1?  А если скомпилируешь под 2.0? 

Они под 2.0 - точнее, Remoting есть только под 2.0. Последний сервис пак - http://www.microsoft.com/downloads/details.aspx?familyid=AB99342F-5D1A-413D-8319-81DA479AB0D7&displaylang=en.

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

PS. И кстати, WCF (замена ремоутинга) тоже валится на висте в присутствии ISA Client 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)