我对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;
}
答案 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);
由于您的本机方法现在是纯粹的,因此您可以将其作为本机类的一部分并直接从包装器中调用它。