为什么ByRef在传递到非托管代码时给出异常? 这是我的C++非托管DLL代码。

为什么ByRef在传递到非托管代码时给出异常? 这是我的C++非托管DLL代码。,c++,.net,vb.net,interop,unmanaged,C++,.net,Vb.net,Interop,Unmanaged,void Only(char *a) { *a++ = 'p'; *a++ = 'r'; *a++ = 'a'; *a++ = 'n'; *a++ = 'i'; *a++ = 0; } .def文件用于导出符号 我在VB.Net应用程序中只使用了以下函数: Declare Sub Only Lib "dllproj2.dll" Alias "Only" (b As StringBuilder) .... Dim s As StringBuilde

void Only(char *a)
{
    *a++ = 'p';
    *a++ = 'r';
    *a++ = 'a';
    *a++ = 'n';
    *a++ = 'i';
    *a++ = 0;
}
.def文件用于导出符号

我在VB.Net应用程序中只使用了以下函数:

Declare Sub Only Lib "dllproj2.dll" Alias "Only" (b As StringBuilder)
....
Dim s As StringBuilder = New StringBuilder()
Only(s)
Declare Sub Only Lib "dllproj2.dll" Alias "Only" (ByRef b As StringBuilder)
它很好用。但当我试着用b作为ByRef时,如下所示

Declare Sub Only Lib "dllproj2.dll" Alias "Only" (b As StringBuilder)
....
Dim s As StringBuilder = New StringBuilder()
Only(s)
Declare Sub Only Lib "dllproj2.dll" Alias "Only" (ByRef b As StringBuilder)
它给出了图中所示的异常

我不明白为什么。ByRef在这里不是更合适吗


谢谢。

必须是
ByVal
。该函数不会覆盖对
StringBuilder
本身的引用。它将更新
StringBuilder
的内容。(类似的问题请参见。)

很难看出这是如何可靠地工作的。<代码> StringBuilder < /Cord>类可能知道C++函数需要多少存储吗?@ JonathanPotter,应该解决什么问题?删除ByRef如何使其工作?