【问题标题】:Why ByRef gives exception while passing to unmanaged code?为什么 ByRef 在传递给非托管代码时会出现异常?
【发布时间】:2013-10-24 09:49:32
【问题描述】:

这是我的 C++ 非托管 dll 代码。

void Only(char *a)
{
    *a++ = 'p';
    *a++ = 'r';
    *a++ = 'a';
    *a++ = 'n';
    *a++ = 'i';
    *a++ = 0;
}

.def 文件用于导出符号。

我在VB.Net应用程序中使用了Only函数如下,

Declare Sub Only Lib "dllproj2.dll" Alias "Only" (b As StringBuilder)
....
Dim s As StringBuilder = New StringBuilder()
Only(s)

它工作正常。但是当我尝试如下使用 b 作为 ByRef 时,

Declare Sub Only Lib "dllproj2.dll" Alias "Only" (ByRef b As StringBuilder)

它给出了图像中显示的异常。

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

谢谢。

【问题讨论】:

  • 很难看出它是如何可靠地工作的。 StringBuilder 类怎么可能知道 C++ 函数需要多少存储空间?
  • @JonathanPotter 应该如何解决这个问题?以及如何删除 ByRef 使其工作?

标签: c++ .net vb.net interop unmanaged


【解决方案1】:

必须是ByVal。该函数不会覆盖对StringBuilder 本身的引用。它宁愿更新StringBuilder 的内容。 (有关类似问题,请参阅 here。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多