【问题标题】:Getting exception while using C++ dll in VB.Net在 VB.Net 中使用 C++ dll 时出现异常
【发布时间】:2013-10-18 05:56:04
【问题描述】:

我创建了非托管 dll 并在 VB.Net 中使用。

两个代码最简洁如下。

VB.Net

Imports System.Text
Imports System.Runtime.InteropServices

Module Module1

    Sub Main()
        Dim c As cls = New cls()
        c.Start()
    End Sub

End Module

Public Class cls
    Declare Sub Only Lib "dllproj2.dll" Alias "Only" (b As StringBuilder)

    Public Sub Start()
        Dim s As StringBuilder = New StringBuilder(15)

        Only(s) '**Actual call to dll code **
        Dim s1 As String = s.ToString.ToLower
        Dim len As Integer = s.ToString.Length.ToString()
        Console.Write(s.ToString())
    End Sub

End Class

C++ DLL

#include<stdio.h>
#include<stdlib.h>
#include<cstring>

extern "C"{
void Only(char *a)
{
    char arr[10];

    printf("Reached");
    sprintf(arr,"This %d",33);
    printf("\n%s\n",arr);
    memcpy(a,arr,10);

}
}

现在只要我访问Only(s) 行,我就会得到图像中显示的异常。

我无法理解异常的原因。代码的输出很好,但是在使用 Visual Studio 2012 Express 运行它时出现上述错误。

这是示例代码,我们也在生产中使用过,我担心它将来可能会导致问题。

请建议有什么方法可以摆脱异常。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    你必须声明bas: UnmanagedType.LPStr

    Declare Sub Only Lib "dllproj2.dll" Alias "Only" (<InAttribute(), MarshalAs(UnmanagedType.LPStr)> b As StringBuilder)
    

    【讨论】:

    • 但是 b 在 C++ 代码中被修改了,所以 InAttribute() 可以吗?我尝试了建议,仍然得到同样的异常..
    • InAttribute 表示数据应该从调用者封送到被调用者,而不是返回给调用者。
    • 好的,我明白了,但是当我使用建议的代码时,我仍然遇到异常。
    • 与我发布的问题相同(图片)
    • 你是否执行了你的 Only 方法??是否正常工作,没有例外?将其提取到 void main 以检查它是否正常工作。现在签名好像没问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多