我有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);
}
这是头文件cppdll.h
:
class __declspec(dllexport) Adder
{
public:
Adder(){;};
~Adder(){;};
void add();
};
如何使用C#调用该函数?
拜托,有人可以帮我解决这个问题吗?
答案 0 :(得分:21)
我会举个例子。
你应该像这样声明你的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)。
然后,在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 ++测试函数。请注意,一旦您想要传递字符串,数组,指针等,它可能会有点棘手。请参阅例如this SO问题。