将类封送到byte []偶尔会抛出(有时)不可捕获的AccessViolationException

时间:2014-04-23 18:21:03

标签: c# marshalling access-violation

我开始相信我错过了.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);
        }
    }

0 个答案:

没有答案