2016-11-09 4 views
5

Я пытаюсь очень базовое взаимодействие между двумя языками. У меня в основном есть код с высокой степенью производительности, который я хочу обрабатывать на C++, а затем возвращать результат в мое приложение.Как взаимодействовать между C# и C++

Все будет скомпилировано в Visual Studio.

Я выбрал int, чтобы быть входным и выходным типом, поскольку сортировка может быть немного выигрышной и не совсем то, с чем я имею дело.

C++ У меня есть:

#include "stdafx.h" // default from vs2013, no idea what it is 

_declspec(dllexport) int Diu(int p) { 
    return p * 2; 
} 

C# У меня есть:

using System; 

namespace Interop { 
    public class Program{ 
     [System.Runtime.InteropServices.DllImport("Hardworker.dll")] 
     public static extern int Diu(int p); 

     private static void Main(string[] args) { 
      Console.WriteLine(Diu(2)); 
     } 
    } 
} 

Так что это довольно простой пример. Но я получаю исключение:

An unhandled exception of type 'System.BadImageFormatException' occurred in Interop.exe

Additional information: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

Проект C++ создан как консольное приложение> Dll в диалоговом окне создания. Я проверил dll C++ в дизассемблере, и я вижу в качестве экспортированного символа Diu.

Uh. Что я пропустил по поводу настройки взаимодействия?

ответ

4

Когда вы получите эту ошибку: HRESULT: 0x8007000B вызван несовместимостью paltform.
Убедитесь, что ваш профиль компилятора настроен на ту же платформу (x86, x64 или AnyCPU).

+0

Ницца. Я мой компьютер x64. Я установил компиляцию в x86. И ошибка изменилась на EntryPointNotFoundException: Не удалось найти точку входа с именем «Diu» в DLL «Hardwork.dll». – CyberFox

+1

@CyberFox C++ управляет именами функций на основе типов параметров и другими квалификаторами функции. Вам нужно объявить функцию 'extern 'C" для экспорта с именем без mangling. –

+0

@YngveHammesrland это действительно сработало. 2 ответов в 1. – CyberFox

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