2009-05-09 2 views
0

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

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

ответ

2

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

+1

ИЛИ вам нужно сообщить компилятору, что некоторые символы должны быть экспортированы. Я сделал некоторые exe перед этими экспортируемыми символами, такими как dll. Это почти то же самое, нужно изменить только специфические параметры dllimport/export для конфигурации и компилятора. – Klaim

0

Вы объявили свою функцию как 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 для получения дополнительной информации.

Смежные вопросы