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

Is this an ok way of calling a C++ function from C#?

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

           /* 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 的评论已经暗示的那样,你的原生 function/method 并不是真正的原生,因为一些参数仍然是 C++/CLI。

如果你想包装到原生 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];
}

您的本机方法的签名如下:

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

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