AccessViolationException при попытке вызвать внешнюю функцию c ++ с 'new char [...]' внутри нее - PullRequest
0 голосов
/ 23 августа 2011

Я обнаружил странную проблему, когда пытался вызвать неуправляемую функцию c ++ из кода c #.

функция c ++ выглядит так:

extern "C"{
__declspec(dllexport) int Test(char * pixels, int length, int height){
    int width = length / height;
    // char * test = new char[length];
    return width;
  }
}

И из C # я пытаюсьчтобы вызвать его, используя следующие конструкции:

[DllImport("Test.exe", EntryPoint = "Test")]
public static extern int Test(byte[] pixels, int length, int height);
...
var bytes = new byte[] { 1, 1, 1, 1, 1 };
var height = 1;
var result = Test(bytes, bytes.Length, height);

Этот код работает хорошо, но ... Если я пытаюсь раскомментировать строку c ++ с помощью 'new', я получаю исключение System.AccessViolationException.

Кто-нибудь может объяснить, что там происходит и почему?

ОБНОВЛЕНО

Спасибо Дэвиду Хеффернану, и теперь мой код выглядит так:

[DllImport("Test.exe", EntryPoint = "Test", 
    CallingConvention = CallingConvention.Cdecl)]
public static extern int Test(byte[] pixels, int length, int height);

К сожалению, он ничего не меняет

RESOLVED

Не использовать * .exe в качестве модуля.После модуля компиляции все работает хорошо как динамическая библиотека.

Это вызвано фундаментальными различиями между библиотеками DLL и связыванием исполняемых файлов.Для получения дополнительной информации см. Страница MSDN LoadLibrary и MSDN О библиотеках DLL страница.

...