如何将C#中的双数组发送到C ++

时间:2011-07-26 21:14:09

标签: c# c++ arrays c++-cli

在我的C#代码中,我有以下数组:

var prices = new[] {1.1, 1.2, 1.3, 4, 5,};

我需要将它作为参数传递给我的托管C ++模块。

var discountedPrices = MyManagedCpp.GetDiscountedPrices(prices) ;

GetDiscountedPrices的签名应该如何?在最微不足道的情况下,当折扣价格等于价格时,C ++方法GetDiscountedPrices应该如何?

编辑:我设法让它编译。我的C#代码是这样的:

    [Test]
    public void test3()
    {
        var prices = new ValueType[] {1.1, 1.2, 1.3, 4, 5,};
        var t = new TestArray2(prices , 5);
    }

我的C ++代码构建:

        TestArray2(     
        array<double^>^ prices,int maxNumDays)
    { 
        for(int i=0;i<maxNumDays;i++)
        {
// blows up at the line below
            double price = double(prices[i]);
        }

但是我收到运行时错误:

System.InvalidCastException:指定的强制转换无效。

编辑:凯文的解决方案有效。我还找到了一个有用的链接:C++/CLI keywords: Under the hood

2 个答案:

答案 0 :(得分:4)

您的托管函数声明在头文件中看起来像这样:

namespace SomeNamespace {
    public ref class ManagedClass {
        public:
        array<double>^ GetDiscountedPrices(array<double>^ prices);
    };
}

以上是上述函数的一个示例实现,它简单地从输入数组中的每个价格中减去一个硬编码值,并将结果返回到一个单独的数组中:

using namespace SomeNamespace;

array<double>^ ManagedClass::GetDiscountedPrices(array<double>^ prices) {

    array<double>^ discountedPrices = gcnew array<double>(prices->Length);
    for(int i = 0; i < prices->Length; ++i) {
        discountedPrices[i] = prices[i] - 1.1;
    }
    return discountedPrices;
}

最后,从C#中调用它:

using SomeNamespace;

ManagedClass m = new ManagedClass();
double[] d = m.GetDiscountedPrices(new double[] { 1.3, 2.4, 3.5 });

**请注意,如果您的托管C ++函数将数组传递给本机函数,则需要对数据进行编组以防止垃圾收集器触及它。如果不知道你的原生函数是什么样子就很难显示一个具体的例子,但是你可以找到一些很好的例子here

答案 1 :(得分:1)

由于您使用的是托管C ++,我相信您希望GetDiscountedPrices的签名为:

array<double>^ GetDiscountedPrices(array<double>^ prices);