Я пытаюсь узнать, как использовать управляемый/неуправляемый код взаимодействия, но я ударил стену, что 4 часа работы в Google не удалось забыть. Я собрал 2 проекта в visual studio, один из которых создал win32 exe, и один из них создал приложение Windows .NET. После кувыркания я получил код C# для правильного вызова кода C++, но отсюда я начал получать AccessViolationException каждый раз, когда я попадал туда. Вот код из файла .cpp:AccessViolationException при вызове самой простой функции C++, о которой я могу думать из управляемого кода
extern "C" __declspec(dllexport) void QuickTest()
{
int iTest = 0;
int aTestArray[3] = {1,2,3};
return;
}
А вот код из C# Windows Forms приложение, назвав его:
[DllImport("UnmanagedEvaluation2.exe")]
static extern void QuickTest();
Довольно просто правильно? Вызов работает, и я могу перейти в код C++ (я включил неуправляемую отладку для проекта), но он умирает от строки создания массива каждый раз с помощью AccessViolationException. Тот же код работает нормально, когда я запускаю исполняемый файл (код C++ находится в проекте консольного приложения, я пытался называть его функцией _tmain и никаких проблем), но при вызове в него из .NET он каждый раз взрывается.
Должно быть что-то очевидное, я здесь отсутствует, но я не придумал ничего полезного в чтении учебников, и большинство сообщений об этом исключении составляют люди, у которых проблемы со сложными маршалами или GCHandles. Заранее благодарю за любую помощь.
Обновление: Вы были прямо внизу, но это странно. Сначала, когда я начал это, я предположил, что не смогу этого сделать (вызов функций в исполняемых файлах), но когда я его попробовал - он действительно работал, это вызов. Кажется, он позволяет вам вызвать функцию в исполняемый файл, но как только вы попытаетесь выделить любую память, она умрет. В любом случае, спасибо за советы, похоже, сейчас работает правильно.
ИЛИ вам нужно сообщить компилятору, что некоторые символы должны быть экспортированы. Я сделал некоторые exe перед этими экспортируемыми символами, такими как dll. Это почти то же самое, нужно изменить только специфические параметры dllimport/export для конфигурации и компилятора. – Klaim