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

时间:2015-04-24 06:22:33

标签: 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;
   }

1 个答案:

答案 0 :(得分:1)

正如xanatos的评论已经建议的那样,你的本机函数/方法并不是真正的本机,因为某些参数仍然是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);

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