2010-07-16 3 views
0

Я имею следующую проблему:Сбои приложений, когда опция Оптимизация кода включена

Я разрабатываю приложение 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)); 

Странная вещь, если отключить опцию оптимизации кода в моих свойствах проекта, программа прекрасно работает!

Что может случиться?

ответ

0

Ваш buffer массив собирает мусор.

Добавить

GC.KeepAlive(buffer); 

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

EDIT: Вам также необходимо прикрепить его.

+0

Благодарим за ответы. Как указал Слэкс, мой буфер собирался в мусор, и его строка кода исправила мои проблемы. Спасибо! – santiageitorx

+0

Этого недостаточно, как указывает Майк, поскольку это не мешает GC перемещать массив. –

+0

Да; ты прав. – SLaks

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)); 
} 

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

Смежные вопросы