在我的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
答案 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);