Как вызвать код C ++ из C # - PullRequest
       30

Как вызвать код C ++ из C #

12 голосов
/ 23 февраля 2012

У меня есть код C ++.Этот код содержит функцию включения / выключения GPS для Windows Mobile.Я хочу вызвать этот метод из кода C #, то есть, когда пользователь нажимает кнопку, код C # должен вызывать код C ++.

Это код C ++ для включения функции GPS:

       #include "cppdll.h"

      void Adder::add()
      {
       // TODO: Add your control notification handler code here
          HANDLE hDrv = CreateFile(TEXT("FNC1:"), GENERIC_READ | GENERIC_WRITE,
                        0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
          if (0 == DeviceIoControl(hDrv, IOCTL_WID_GPS_ON, NULL, 0, NULL, 0, NULL, NULL))
          {
             RETAILMSG(1, (L"IOCTL_WID_RFID_ON Failed !! \r\n")); return;
          }
             CloseHandle(hDrv);

         return (x+y);
       }

И это заголовочный файл cppdll.h:

       class __declspec(dllexport) Adder
       {
          public:
           Adder(){;};
          ~Adder(){;};
         void add();
        };

Как я могу вызвать эту функцию с помощью C #?

Пожалуйста, кто-нибудь может мне помочь с этой проблемой?

1 Ответ

21 голосов
/ 23 февраля 2012

Я приведу вам пример.

Вы должны объявить свои функции C ++ для экспорта следующим образом (при условии недавнего компилятора MSVC):

extern "C"             //No name mangling
__declspec(dllexport)  //Tells the compiler to export the function
int                    //Function return type     
__cdecl                //Specifies calling convention, cdelc is default, 
                       //so this can be omitted 
test(int number){
    return number + 1;
}

И скомпилируйте ваш проект C ++ как библиотеку dll. Установите целевое расширение вашего проекта на .dll, а Тип конфигурации на Динамическую библиотеку (.dll).

enter image description here

Затем в C # объявляем:

public static class NativeTest
{
    private const string DllFilePath = @"c:\pathto\mydllfile.dll";

    [DllImport(DllFilePath , CallingConvention = CallingConvention.Cdecl)]
    private extern static int test(int number);

    public static int Test(int number)
    {
        return test(number);
    }
}

Затем вы можете вызывать вашу тестовую функцию C ++, как и следовало ожидать. Обратите внимание, что это может быть немного сложнее, если вы хотите передать строки, массивы, указатели и т. Д. См., Например, этот ТАК вопрос.

...