AccessViolationException при вызове самой простой функции c ++, которую я могу придумать из управляемого кода - PullRequest
0 голосов
/ 10 мая 2009

Я пытаюсь научиться использовать управляемое / неуправляемое взаимодействие кода, но я столкнулся со стеной, которую 4 часа поиска в Google не смогли преодолеть. Я собрал 2 проекта в Visual Studio, один из которых создал Win32 EXE, а другой - приложение Windows Forms .NET. После нескольких раздумий я получил код на C # для правильного вызова кода на c ++, но с этого момента я начал получать AccessViolationException каждый раз, когда попадал туда. Вот код из .cpp файла:

        extern "C" __declspec(dllexport) void QuickTest()
    {
        int iTest = 0;
        int aTestArray[3] = {1,2,3};
        return;
    }

А вот код приложения Windows C #, вызывающий его:

        [DllImport("UnmanagedEvaluation2.exe")]
        static extern void QuickTest();

Довольно просто, верно? Вызов работает, и я могу войти в код на c ++ (я включил неуправляемую отладку для проекта), но он умирает в строке создания массива каждый раз с AccessViolationException. Тот же код работает нормально, когда я запускаю исполняемый файл (код c ++ находится в проекте консольного приложения, я попытался вызвать его из функции _tmain и никаких проблем), но при обращении к нему из .NET он взрывается каждый раз.

Должно быть что-то очевидное, чего мне здесь не хватает, но я не нашел ничего полезного в чтении учебных пособий, и большинство постов по этому исключению - это люди, имеющие проблемы со сложными маршалингами или GCHandles. Заранее спасибо за любую помощь.

Обновление: Вы были прямо внизу, но это странно. Сначала, когда я начал это, я предполагал, что я не смогу это сделать (вызывать функции в исполняемых файлах), но когда я попробовал это - это действительно сработало, это вызов. Кажется, что это позволяет вам вызывать функцию в исполняемый файл, но как только вы пытаетесь выделить какую-либо память, она умирает. В любом случае, спасибо за совет, похоже, теперь он работает правильно.

Ответы [ 2 ]

2 голосов
/ 10 мая 2009

Вы не можете вызывать функции в исполняемых файлах извне этих исполняемых файлов. Вам нужно скомпилировать ваш код в DLL.

0 голосов
/ 12 мая 2009

Вы объявили свою функцию как extern "C", что означает, что она использует cdecl в качестве соглашения о вызовах. По умолчанию DllImport использует StdCall в качестве соглашения о вызовах. Это может быть причиной сбоя вашего кода.

Попробуйте импортировать вашу функцию в код .NET как

    [DllImport("UnmanagedEvaluation2.exe", CallingConvention=CallingConvention.Cdecl)]
    static extern void QuickTest();

Подробнее см. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx.

...