2013-04-11 2 views
0

У меня есть файл DLL, который написан на C. Я пытаюсь использовать в C DLL (ImportDLL) в своем C# -коде. Мой метод возвращает параметр. Метод C называется правильно, но он разбился после того, как процесс и дает ошибку **"System.AccessViolationException: Attempted to read or write protected memory.AccessViolationExceptiond: Попытка чтения/записи защищенной памяти

Это часто указывает на то, что другая память повреждена "** после процесса завершения.

Мой C декларация

int preProcessAndBestImagesC(
     char* ..., 
     size_t* ..., 
     char** ..., 
     size_t* ..., 
     (struct)* ..., 
     size_t* ..., 
     int** ..., 
     (struct)** ..., 
     int ..., 
     int printStatus 
    ); 

Мои C# Декларация

[DllImport(@"abc.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true, BestFitMapping = true, EntryPoint = "xxx")] 
    [return: MarshalAs(UnmanagedType.I4)] 
    unsafe private static extern int xxx(
     String p_ ...,            
     [MarshalAs(UnmanagedType.I2)] out UInt16 p_numImageFilesOrDirs, 

     String[] p_vecImageFilesOrDirs,    

     [MarshalAs(UnmanagedType.I2)] out UInt16 ..., 
     [MarshalAs(UnmanagedType.LPArray)] out (struct)[] ..., 
     [MarshalAs(UnmanagedType.I2)] out UInt16 ..., 
     out Int16[] ..., 
     [MarshalAs(UnmanagedType.LPArray)] out (struct)[] ..., 
     [MarshalAs(UnmanagedType.I2)] Int16 ..., 
     [MarshalAs(UnmanagedType.I2)] Int16 ... 
    ); 

кто-нибудь знает, в чем проблема?

+0

Пробовал ли вы Google для этого? Я уверен, что вы уже найдете полезные ответы, даже здесь, в stackoverflow. –

ответ

0

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

MSDN

Перейти к

Инструменты-> Параметры

Debugging-> Общие

вариант снимите флажок " Запретить оптимизацию JIT при нагрузке модуля "

+0

Я пытаюсь это решение, но оно не работает для меня. – mmpatel009

0

Декларация, например marshalling of parameters, cdecl/stdcall, может быть неправильным.

Это также может быть проблема предотвращения выполнения данных (DEP). В этом случае используйте

editbin.exe /NXCOMPAT:NO "$(TargetPath)" 

в событии после постройки.

+0

Просьба предоставить более подробную информацию, заблаговременно. – mmpatel009

+0

Рассматривая другой вопрос, который вы разместили здесь (http://stackoverflow.com/questions/15925884/an-unhandled-exception-of-type-system-executionengineexception-occurred-in-xxx), это, вероятно, проблема сортировки. Измените свой вопрос и покажите нам как оригинальную подпись функции в C, так и ваш оператор DllImport в C#. –

+0

Пожалуйста, см. Мою декларацию c и оператор C# DLLImport в C# и скажите, какие изменения необходимы в моем коде C#. – mmpatel009

0

Я хотел бы предложить следующее:

Учитывая DLL возвращает указатель на память, пожалуйста, убедитесь, что Маршалинг ваших данных/параметра. Вы можете использовать INTPTR для указания на память, выделенную DLL.

Также убедитесь, что DLL неявно удаляет выделенную память. Если это так, рассмотрите возможность перезаписи кода DLL (если возможно)

Надеюсь, это поможет.