如何从C#调用C++代码

Pir*_*aba 13 c# c++ c++-cli windows-mobile

我有C++代码.该代码包含Windows移动GPS启用/禁用功能.我想从C#代码中调用该方法,这意味着当用户单击按钮时,C#代码应该调用C++代码.

这是用于启用GPS功能的C++代码:

       #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);
       }
Run Code Online (Sandbox Code Playgroud)

这是头文件cppdll.h:

       class __declspec(dllexport) Adder
       {
          public:
           Adder(){;};
          ~Adder(){;};
         void add();
        };
Run Code Online (Sandbox Code Playgroud)

如何使用C#调用该函数?

请问,有人可以帮我解决这个问题吗?

Gle*_*eno 23

我给你举个例子.

您应该声明您的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;
}
Run Code Online (Sandbox Code Playgroud)

并将您的C++项目编译为dll库.将项目目标扩展名设置为.dll,将"配置类型"设置为"动态库"(.dll).

在此输入图像描述

然后,在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像预期的那样调用C++测试函数.请注意,一旦您想要传递字符串,数组,指针等,它可能会有点棘手.例如,参见这个 SO问题.