Я обнаружил странную проблему, когда пытался вызвать неуправляемую функцию 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 страница.