尝试使用
num
直接喜欢
ProcessOrder(num);
由于原文中引用的错误而失败“
无法从转换参数1
System::Int32 ^
到
int &
“因为传递的(指针)变量和预期的(引用)参数之间的间接寻址级别不同。
ProcessOrder(*num);
更正间接寻址并获取要匹配的类型,但编译失败,并出现错误“
gc堆中的对象(未绑定的值类型)无法转换为本机引用
". 这指出了真正的问题,即非托管/未绑定的引用不能指向gc托管堆,这会受到压缩和重新洗牌的影响。
最简单的解决方案是使用
tracking reference
int%
answer
与作为副本链接的问题。
void StoreWrapper::ProcessOrder(int% num)
{
LegacyStore* legacyStore = new LegacyStore();
legacyStore->ProcessOrder(*&num); // shorthand for:
//
// int &n = *#
// legacyStore->ProcessOrder(n);
// num = n;
}
// to be called from C# as:
//
// int number = 0;
// store.ProcessOrder(ref number);
[
]也可以使用
号码
void StoreWrapper::ProcessOrder([System::Runtime::InteropServices::Out] int %num)
{
LegacyStore* legacyStore = new LegacyStore();
pin_ptr<int> p = #
legacyStore->ProcessOrder(*p);
}
// to be called from C# as:
//
// int number = 0;
// store.ProcessOrder(out number);
[
编辑#2
]编辑代码并添加注释,以涵盖将值返回给C调用方。