应用程序在启用“代码优化”选项时崩溃

时间:2010-07-16 20:19:49

标签: c# optimization crash unmanaged

我遇到以下问题:

我正在开发一个C#应用程序,它需要不安全的代码来调用非托管的c ++函数。结构是:

[StructLayout(LayoutKind.Sequential)]
unsafe struct DataStruct
{
    public UInt16 index;
    public UInt16 response;
    public byte* addr; //this is a pointer to a byte array which stores some some data.
}

这就是我导入函数的方式:

[DllImport("imagedrv.dll", EntryPoint = "SendCommand", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
private static extern int SendCommand([MarshalAs(UnmanagedType.Struct, SizeConst = 8)]ref DataStruct s);

该函数是从一个线程成功调用的,我得到了预期的结果,但问题是每当我与我的Windows.Form表单交互时,整个应用程序崩溃。如果我将鼠标移到它上面或者与我的contextmenustrip控件进行交互并不重要。如果我不与表单交互,程序运行正常。

电话示例:

DataStruct s;
byte[] buffer = new byte[512];

s.index = 0x03;
s.response = 0;
fixed (byte* pBuffer = buffer) s.addr = pBuffer;
System.Console.WriteLine(SendCommand(ref s));

奇怪的是,如果我在项目属性中禁用代码优化选项,程序运行正常!

可能会发生什么?

2 个答案:

答案 0 :(得分:3)

尝试在固定块内移动SendCommand调用:

DataStruct s;
byte[] buffer = new byte[512];

s.index = 0x03;
s.response = 0;
fixed (byte* pBuffer = buffer) {
    s.addr = pBuffer;
    System.Console.WriteLine(SendCommand(ref s));
}

否则,事情可能会在没有你期待的情况下移动。

答案 1 :(得分:0)

您的buffer数组正在被垃圾收集。

添加

GC.KeepAlive(buffer);
在P / Invoke呼叫之后

编辑:您还需要固定它。