Проблема с C # защищенной памятью - PullRequest
0 голосов
/ 25 августа 2011

Я вызываю нативную C ++ DLL.На самом деле я сделал это дважды (две разные программы на C #, две разные программы на C ++).Оба раза я создаю память на стороне C #.Оба раза я использовал довольно сложные маршалловые структуры, которые отправлял по ссылке.

Однако одна из моих программ работает нормально.

Другая работает до тех пор, пока собственный C ++ не попытается прочитать значение изданные отправлены.Но тогда взрыв , я столкнулся с ошибкой памяти, защищенной от чтения / записи?

Я не понимаю, как две программы, созданные с использованием одной и той же Visual Studio, могут привести к тому, что одна из них позволит мнедоступ к памяти и прочее запрещены.

Я проверил настройки, оба в настройках проекта в значительной степени идентичны?

В проекте возникли проблемы, я даже уменьшил отправленные данныек структуре точно такого размера, как так:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
struct Shared2_s
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
    public byte[] filler2;
    //40
}

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Если вам нужно, чтобы экземпляр Shared2_s имел время жизни дольше, чем просто вызов нативного метода, вам нужно выделить его в неуправляемую память и очистить его снова, когда закончите.

var pointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Shared2_s)));
var inst = new Shared2_s();
Marshal.StructureToPtr(inst, pointer, false);
...
MyNativeMethod(pointer);
...
Marshal.FreeHGlobal(pointer);

Объявление DllImport MyNativeMethod должно быть скорректировано таким образом, чтобы вместо параметра ref Shared2_s вместо него принималось IntPtr.

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

0 голосов
/ 25 августа 2011

Для такого рода вещей я использую MemoryMappedFile и имя Mutex - никакого маршаллинга не требуется, только некоторые байты в памяти, которые могут быть прочитаны / записанылюбой с правильными разрешениями и знанием имени MemoryMappedFile.

[РЕДАКТИРОВАТЬ] Со стороны C ++ это см. в примере MSDN здесь . [/ EDIT]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...