VB.Net:DllImport和Declare语句的差异

时间:2014-02-10 13:16:13

标签: vb.net interop fortran

我正在尝试使用Fortran库中的函数。该函数应该返回一个字符串。如果我用这个

Friend Declare Ansi Sub LaA_LabelGet Lib "V3Mat.dll" (ByRef hLaA As IntPtr, ByVal iRegion As Integer, ByVal cLabel As String, ByVal intLabelLen As Integer)
如果我使用

声明它可以正常工作

<DllImport("V3Mat.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi)>
Friend Sub LaA_LabelGet(ByRef hLaA As IntPtr, ByVal iRegion As Integer, ByVal cLabel As String, ByVal intLabelLen As Integer)
End Sub

cLabel始终为空白。

任何人都可以指出两者之间的区别。我宁愿使用第二个定义,因为它允许我通过使用常量来设置要使用的库。

1 个答案:

答案 0 :(得分:3)

Declare 语句是VB.NET中采用的遗留语法,它的工作方式与VB6中的方式相同。在你的情况下,它做的一件事是它允许本机代码到字符串中。就像它可能回到VB6。这在.NET中完全无效,字符串是不可变的。

<DllImport>声明中的确切等效内容为<MarshalAs(UnmanagedType.VBByRefStr)> ByRef cLabel As String

更好的解决方案是将参数声明为ByVal cLabel As StringBuilder并传递具有足够容量的正确初始化的StringBuilder对象。然后使用其ToString()方法获取返回的字符串。