我正在尝试将一个对象数组从c ++ / cli方法传回给调用的VB.NET例程。函数调用返回bool以指示成功或失败,并通过参数调用在对象数组中返回扩展信息。
我已将代码剥离为两个示例代码单元以演示问题。
在调用TestReplaceArray之后,应填写TSAResult数组。 e.g:
Dim TSAResult() As TestStruct = Nothing
Dim MTCP As New TestCppPart()
MTCP.TestReplaceArray(TSAResult)
我没有回到我的期望,而且可能让我感到愚蠢的是对他们的回归。
为了获得更多诊断信息以查看事物的分离,我创建了这个调用例程,它填充TestStructureArray只是为了查看调用方法中出现的内容:
'This is the VB.Net caller routine
Dim TestStructArray() As TestStruct = Nothing
TestStructArray = New TestStruct(1) {}
Dim TSAResult() As TestStruct = Nothing
Dim TS As New TestStruct 'put some junk in it
TS.somevar = 10
TestStructArray(0) = TS
TS = New TestStruct
TS.somevar = 11
TestStructArray(1) = TS
Dim MTCP As New TestCppPart()
MTCP.TestReplaceArray(TestStructArray) 'Call the cpp/cli routine
TSAResult = TestStructArray 'take a gander and what came back
调用的C ++ / CLI例程是:
// compiled with /clr
public ref struct TestStruct {
int somevar;
};
public ref class TestCppPart {
public:
void TestReplaceArray(array<TestStruct ^>^ IPInfoArray) {
IPInfoArray = gcnew array<TestStruct ^>(5);
}
};
我可以看到传递给对象数组的(仅用于测试)就是我传递的内容。我还可以看到我可以用&#34; IPInfoArray = gcnew数组(5)替换数组;&#34;线。它在元素中没有任何东西,但IPInfoArray现在引用了一个5元素数组。
返回VB.Net代码时,原始(仅测试)数组仍然存在并填充。
我能弄清楚的是如何告诉c ++ / cli我想要更新对数组的引用(如果你愿意的话,ByRef),所以它将使用新数组回到VB.Net。
谢谢,我觉得这应该是显而易见的,但我已经卡住了!
答案 0 :(得分:1)
您的C ++ / CLI代码需要如下所示声明数组(请注意&#39;%&#39;符号):
void TestReplaceArray(array<teststruct^> ^%IPInfoArray)
在这篇文章中也提到: Does the ^ symbol replace C#'s "ref" in parameter passing in C++/CLI code?