c# - 这是从 C# 调用 C++ 函数的好方法吗?

标签 c# c++ interop clr

我对 C# 和 C++ 之间的语言间调用不是很有经验。但是,我创建了一个包含 2 个项目的 VS2013 解决方案。一个项目是 C# 项目。另一个项目是 C++ 项目(带 CLR 的 DLL)。我想知道我的示例代码是否正常?该示例仅显示如何将一些值从 C# 传递到 C++。 C++ 函数打印出值并写入输出数组。我验证了它的有效性,但我想知道是否有什么我错过了并且应该注意和/或注意的?

           /* This is the code in my C# file */
           int val1 = 3;
           int val2 = 4;
           int[] input = new int[10] {1,2,3,4,5,6,7,8,9,10};
           int[] output = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
           thisInstance = new DSPClassProxy();
           thisInstance.myMethod(val1, val2, input, output);

这是在我的 .h 文件中声明“myMethod”的方式:

void myMethod(int val1, int val2, array<int>^ in, array<int>^ output);

这是该函数的实现(在我的 .cpp 文件中):

 void ClassProxy::myMethod(int val1, int val2, array<int>^ in, array<int>^ output)
{

     /* Call regular C function */
     myNativeMethod(m_pNativeObject, val1, val2, in, output);

}

C 函数“myNativeMethod”是这样实现的:

int myNativeMethod(void* thisInst, int val1, int val2, array<int>^ in,  array<int>^ output)
{
    int n;
    myClass* thisClass = (myClass*) thisInst;

       printf("sample 1: %d \n", val1);
       printf("sample 2: %d \n", val2);
       for (n = 0; n < 10; n++)
       {
          printf("sample %d: %d \n", n, in[n]);
       }

       output[0] = 1024;
       output[1] = 1024;
       output[2] = 1024;
       output[3] = 1024;
       output[9] = 1024;

       return 0;
   }

最佳答案

正如 xanatos 的评论所暗示的那样,您的 native 函数/方法并不是真正的 native ,因为某些参数仍然是 C++/CLI。

如果您想包装到 native C++,我建议(就像我之前自己做的那样):

void ClassProxy::myMethod(int val1, int val2, array<int>^ in, array<int>^ output)
{
    std::vector vin;
    pin_ptr<in> pin(&in[0]);
    int *first(pin), *last(pin + in->Length);
    std::copy(first, last, vin.begin());

     /* Call regular C function */
     std::vector<int> voutput(output->Length);
     m_pNativeObject->myNativeMethod(val1, val2, vin, voutput);

     for(int i=0;i<voutput->size();i++)
       output[i]=voutput[i];
}

您的 native 方法具有如下签名:

void myMethod(int val1, int val2, const std::vector<int> &in, std::vector<int> &output);

由于您的 native 方法现在是纯方法,您可以将其作为 native 类的一部分并直接从包装器中调用它。

关于c# - 这是从 C# 调用 C++ 函数的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29840101/

相关文章:

java - 解析从 Java 中的 .NET Web 服务返回的 .NET 数据集

c# - 如何调用具有方法属性的方法?

C++模拟鼠标左键点击最小化程序

c++ - 创建动态数组?

c# - 从 C# 加载托管资源并将其作为流句柄传递给 native C++ 代码

c# - 如何将 struct 从 C# managed 传递到 C++ unmanaged DLL 并获得 struct 结果?

c# - Microsoft.NETCore.App 更新到 2.1.0-rc 的问题

c# - 从 mysql 数据库读取时在 Visual Studio 中出现错误

c# - 从 2 个派生类中选择正确的枚举列表

c++ - global static const shared_ptr 奇怪地被另一个 shared_ptr 的析构函数窃取和删除,为什么?