.net 调用ResetDC时崩溃,devmode从封送结构复制到字节数组

.net 调用ResetDC时崩溃,devmode从封送结构复制到字节数组,.net,interop,struct,marshalling,gdi,.net,Interop,Struct,Marshalling,Gdi,在传递Devmode时,我在调用ResetDC时收到System.AccessViolationException。我正在做以下工作 // create and marshall the devmode to a byte array. DEVMODE myDevmode = new DEVMODE {dmSize = (short) Marshal.SizeOf(typeof (DEVMODE))}; myDevmode.dmFields = DM.Orientation; myDevmo

在传递Devmode时,我在调用ResetDC时收到System.AccessViolationException。我正在做以下工作

// create and marshall the devmode to a byte array.

DEVMODE myDevmode = new DEVMODE {dmSize = (short) Marshal.SizeOf(typeof (DEVMODE))};

myDevmode.dmFields = DM.Orientation;
myDevmode.dmOrientation = DMORIENT_LANDSCAPE;

IntPtr ptDM = Marshal.AllocHGlobal(myDevmode.dmSize);
Marshal.StructureToPtr(myDevmode, ptDM, false);

byte[] byteDM = new byte[myDevmode.dmSize];
Marshal.Copy(ptDM, byteDM, 0, myDevmode.dmSize);
然后,我通过com接口(现有体系结构无法更改)调用以下方法:

SetDevMode(ref byteDM[0], myDevmode.dmSize)
在com接口的另一端,在.net代码的另一端运行以下命令:

    public void SetDevMode(ref byte pDevMode, int nDevModeSize)
    {
        _pageSetupDevMode = new byte[nDevModeSize];

        unsafe
        {
            fixed (byte* p = &pDevMode)
            {
                Marshal.Copy((IntPtr)p, _pageSetupDevMode, 0, nDevModeSize);
            }
        }
    }
随后,会调用ResetDC:

Win32.ResetDC(_hRefDc, ref _pageSetupDevMode[0]);
在这一点上,我得到了异常

发生类型为“System.AccessViolationException”的未处理异常 其他信息:尝试读取或写入受保护内存。这通常表示其他内存已损坏

这发生在gdi32.dll中


有什么想法吗?

如上面的评论所述,这不是内存处理的问题,而是将除空之外的所有devmode传递到ResetDC的结果-我在一个在线示例中看到了这一点,但它似乎在打印时“打乱”了gdi


我现在从打印机获得了一个有效的devmode,作为上述代码的基础,这很好。抱歉。

抱歉,看来我的错误是使用了不兼容的devmode,而不是我的编组。