Jak wywołać kod C++ Z C#

Mam kod C++. Ten kod zawiera funkcję włączania/wyłączania GPS systemu Windows mobile. Chcę wywołać tę metodę z kodu C#, co oznacza, że gdy użytkownik kliknie przycisk, kod C # powinien wywołać do kodu C++.

Jest to kod C++ umożliwiający działanie 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);
       }

A to jest plik nagłówkowy cppdll.h:

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

Jak mogę wywołać tę funkcję używając C#?

Proszę, czy ktoś może mi pomóc z tym problemem?
Author: mschwaig, 2012-02-23

1 answers

Dam ci przykład.

Powinieneś zadeklarować swoje funkcje C++ do eksportu w ten sposób (zakładając, że niedawno kompilator 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;
}

I skompilować swój projekt C++ jako bibliotekę dll. Ustaw rozszerzenie docelowego projektu na .dll, oraz Typ konfiguracji do biblioteki dynamicznej (.dll).

Tutaj wpisz opis obrazka

Następnie w C# declare:

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);
    }
}

Następnie możesz wywołać swoją funkcję testową C++, jak można się spodziewać. Zauważ, że może to być trochę trudne, gdy chcesz przekazać ciągi, tablice, wskaźniki itp. Zobacz na przykład to więc pytanie.

 19
Author: Gleno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:57