我可以通过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函数,然后将值复制回数组?问候

我可以通过C++/CLI包装器将C#数组传递给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);

无需手动封送。