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.
Какие бы вариации на тему ремоутинга я ни делал, какие бы примеры из сети не брал - все одно: ArgumentNullException в функции CopyToManaged. На канале IPC вместо 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 вроде работает.
В описании исключения содержится намек на использование какого-то неуправляемого кода. (?)
Буду благодарен за любую информацию как найти ошибку. Скорее всего где-то у меня потоки криво написаны.
Спасибо.