我开始相信我错过了.Net编组功能非常重要的东西。
情况是我有C#应用程序需要与现有C ++应用程序互操作而不修改C ++进程间协议。 C ++应用程序使用序列化在进程之间传递结构,序列化实际上是结构的内存快照。
我经常必须(un)将这些对象封送到tcp或多播流中。
我发现99.95%的时间一切都很好,但在其他时候,但是每隔一段时间,我就会得到一个AccessViolationException,而且更常见的是,捕获它们的标准机制失败了,通常在客户端GUI(而不是服务器)进程中。
下面是我创建的一个帮助方法,它可以帮助将一个类封送到一个字节缓冲区进行传输。
我不明白为什么会产生访问冲突,因为结构(在本例中实际上是类)是简单的类,最多只能实现一个或两个接口,而不涉及继承。
我更加困惑的是,当应用程序从本地驱动器运行时,为什么异常有时会漏掉。
关于这里有什么问题的任何想法?
供参考:VS 2010,.Net 4.0。
[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]
[System.Security.SecurityCritical]
public static Tuple<byte[], bool> MarshalClass<T>(T theClass) where T : class
{
try
{
int aSize = Marshal.SizeOf(typeof(T));
byte[] aBuffer = new byte[aSize];
IntPtr aBuffPtr = Marshal.AllocHGlobal(aSize);
Marshal.StructureToPtr(theClass, aBuffPtr, false);
Marshal.Copy(aBuffPtr, aBuffer, 0, aSize);
Marshal.FreeHGlobal(aBuffPtr);
return new Tuple<byte[], bool>(aBuffer, true);
}
catch (System.AccessViolationException)
{
return new Tuple<byte[], bool>(null, false);
}
}