Сбой приложения при включенной опции оптимизации кода - PullRequest
0 голосов
/ 17 июля 2010

У меня следующая проблема:

Я занимаюсь разработкой приложения на 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, происходит сбой всего приложения.Неважно, наведу ли я на него курсор мыши или взаимодействую со своим контекстным контролем.Если я не взаимодействую с формой, программа работает нормально.

Пример вызова:

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 ]

3 голосов
/ 17 июля 2010

Попробуйте переместить вызов 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));
}

В противном случае все может измениться, даже если вы этого не ожидаете.

0 голосов
/ 17 июля 2010

Ваш массив buffer подвергается сборке мусора.

Добавьте

GC.KeepAlive(buffer);

после вызова P / Invoke.

EDIT Вы также должны прикрепить это.

...