从 C# 应用调用本机函数

Calling native function from C# app

本文关键字:本机 函数 调用 应用      更新时间:2023-10-16

我有用C#编写的WinForms。我的项目中C++动态类库。我需要从 C# 应用调用本机代码。S0,如何从我的 C# 应用程序调用下面的 C++ 函数。

int printVals(void* thisInstance)
{
   myClass* thisClass = (myClass*) thisInstance;
   printf("Registered X: %dn", ((int) thisClass->x));
   printf("Registered Y: %dn", ((int) thisClass->y));
   printf("Registered Z: %dn", ((int) thisClass->z));
   return 0;
}
typedef void (*callback)(void* thisInstance, char* message);
typedef struct myClassT
{
   callback thisCallback;
   char x;
   short y;
   long z;
} myClass;

如果它只用于一个函数,则可以使用 P/Invoke 从 C# P/Invoke 调用它如果对C++本机库进行了大量调用,则可能必须考虑使用 C++/CLI 项目(引用 dll,包含标头,然后调用函数)。

从您的代码中,我无法直接看到哪些变量是 C# 表单的输入/输出。但这就是我的做法:

  • 在 form.h 文件中,包括 C++ 项目的头文件。
  • 在表单的私有变量的声明之间,包括:

    YourClass *yourObject = new YourClass();

  • 在 forms.h 中声明一个函数,从中调用 c++ 代码。

  • 在 forms.cpp 文件中,实现函数并以正常方式调用 C++ 函数:

    yourObject->yourFunction(Argument1, Argument2);

  • 需要将一些类型转换从 C# 类型转换为本机类型,例如,将双精度从 numericUpDown 转换为 C++ 双精度

    System::Decimal::ToSingle(this->numericUpDown1->Value);

    对于数据类型,请搜索有关如何转换它们的 MSDN 文档。