我可以通过C++/CLI包装器将C#数组传递给C指针吗
本文关键字:数组 指针 C++ 可以通过 CLI 包装 | 更新日期: 2023-09-27 18:08:42
这是我的C函数定义:
//C
int FXForwardRate(
long *riskZCDates, /* (I) Risk ZC dates */
double *fwdRate); /*(O) Output */
第一个参数实际上指向一个长的数组。在C#中,我最好这样称呼它:
//C#
int[] array = {1,2,3}; //if i'm not mistaking long in C is int in :NET
double fwdRate = 0;
Class1.FXForwardRate(array, ref fwdRate);
现在,对于我的C++/CLI代码,我不知道如何在Class1类中声明函数(我没有把整个代码写得简明扼要(:
//C++/CLI
int Class1::FXForwardRateW(int[] premium, double %fwdRate)
{
double _tempFwdRate = 0.0;
int _status = FXForwardRate(premium, &_tempFwdRate);
fwdRate = _tempFwdRate;
return _status;
}
我从我写的另一个函数中知道,我对第二个参数所做的是正确的(但不确定这是最好的方法(。但是第一个怎么样?我应该做同样的事情吗?即:定义一个指针,将其传递给C函数,然后将值复制回数组?问候
正确的解决方案(Lirik和pst都给出了正确方向的指针(是:
int Class1::FXForwardRateW(array<int>^ premium, double %fwdRate)
{
double tempFwdRate = fwdRate;
pin_ptr<int> premiumPtr = &premium[0];
int status = FXForwardRate(premiumPtr, &tempFwdRate);
fwdRate = tempFwdRate;
return status;
}
using System::Runtime::InteropServices::OutAttribute;
int Class1::FXForwardRateW(array<int>^ premium, [Out] double% fwdRate)
{
double tempFwdRate;
pin_ptr<int> pin = &premium[0];
int status = FXForwardRate(reinterpret_cast<long*>(pin), &tempFwdRate);
fwdRate = tempFwdRate;
return status;
}
在C#看来,这将具有签名:
int FXForwardRateW(int[] premium, out double fwdRate);
(如果fwdRate
真的只是输出而不是输入/输出,那么从语义上讲,您希望参数类型是out double
而不是ref double
。(
但是,请注意,使用C++/CLI可能会过度使用,除非您在其他地方要执行更复杂的封送处理;直接从C#使用P/Invoke可以更容易地完成:
[DllImport("c-library-name.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int FXForwardRate(int[] premium, out double fwdRate);
无需手动封送。