2013-09-11 5 views
0

Я делаю приложение для сбора данных в C#, которое вызывает DLL (поставляется поставщиком DAQ-карты), и для этого требуется, чтобы я регистрировал свои буферы ввода-вывода в этой DLL. У меня есть поток писем, который заполняет буфер образцами. Я вижу странное поведение, что через некоторое время выходной сигнал становится шумным, и я подозреваю, что это потому, что GC куда-то перемещает мои буферы, поэтому код в DLL имеет указатель на неправильный адрес и выводит мусор на ЦАП.C# unmovable динамически распределенные массивы

1) Как я могу проверить, прав ли я (массив перемещен)?

2) Если да, то как сделать массив неотмеченным? На странице Fixed Size Buffers в MSDN говорится, что я могу сделать буфер фиксированного размера, но мне нужно, чтобы он динамически распределялся (поэтому его можно настроить до начала загрузки).

+0

[ 'Marshal.AllocHGlobal'] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.allochglobal.aspx) может помочь здесь. –

+0

http://www.codeproject.com/Articles/17610/Pinned-Object – I4V

ответ

2

Вы используете:

int[] myarray = new int[1000]; 

GCHandle handle = GCHandle.Alloc(myarray, GCHandleType.Pinned); 

Помните

handle.Free(); 

в конце. Поэтому, если DLL-метод порождает поток и немедленно возвращается, обычно лучше поместить дескриптор в поле класса, а не как локальную переменную.

Обратите внимание, что если вам нужно сделать массив в режиме реального времени вызовом функции, вам не нужно это делать. Так, например:

int[] myarray = new int[1000]; 
MyPInvokeMethod(myarray); 

За всю жизнь MyPInvokeMethod массив будет автоматически возлагали.

1
int[] data = new int[size]; 
GCHandle h = GCHandle Alloc(data, GCHandleType.Pinned); 
IntPtr ptr = h.AddrOfPinnedObject(); 

// ptr points to fixed memory which is not moved by GC 
// and can be accessed by unmanaged code 

// ... 

h.Free();  // now array can be moved 
+0

Спасибо. Могу ли я использовать переменную 'data', как и раньше? – Illia

+0

Да, вы можете использовать переменную 'data' - читать и записывать элементы массива обычным способом. Все время 'GCHandle h' существует и не выпущено, массив невозможен. Вы можете сделать член класса 'GCHandle h', чтобы сохранить массив unmoveable. –

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