如何编写我的 C++ 函数以便我可以从 C# 调用它?
我有 C++ 代码.该代码包含 Windows 移动 GPS 启用/禁用功能.我想从 C# 代码中调用该方法,这意味着当用户单击按钮时,C# 代码应该调用 C++ 代码.
I have C++ code. That code contains Windows mobile GPS enable/disable functionality. I want to call that method from C# code, that means when the user clicks on a button, C# code should call into C++ code.
这是用于启用 GPS 功能的 C++ 代码:
This is the C++ code for enabling the GPS functionality:
#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# 调用该函数?
How can I call that function using C#?
请问,有人能帮我解决这个问题吗?
Please, can anybody help me out with this issue?
我举个例子.
你应该像这样声明你的 C++ 函数用于导出(假设最近的 MSVC 编译器):
You should declare your C++ functions for export like so (assuming recent MSVC compiler):
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).
And compile your C++ project as a dll library. Set your project target extension to .dll, and Configuration Type to Dynamic Library (.dll).
然后,在 C# 中声明:
Then, in 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);
}
}
然后您可以按预期调用 C++ 测试函数.请注意,一旦您想传递字符串、数组、指针等,它可能会变得有点棘手.参见例如 this SO 问题.
Then you can call your C++ test function, as you would expect. Note that it may get a little tricky once you want to pass strings, arrays, pointers, etc. See for example this SO question.