我正在尝试使用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
始终为空白。
任何人都可以指出两者之间的区别。我宁愿使用第二个定义,因为它允许我通过使用常量来设置要使用的库。
答案 0 :(得分:3)
Declare 语句是VB.NET中采用的遗留语法,它的工作方式与VB6中的方式相同。在你的情况下,它做的一件事是它允许本机代码写到字符串中。就像它可能回到VB6。这在.NET中完全无效,字符串是不可变的。
<DllImport>
声明中的确切等效内容为<MarshalAs(UnmanagedType.VBByRefStr)> ByRef cLabel As String
更好的解决方案是将参数声明为ByVal cLabel As StringBuilder
并传递具有足够容量的正确初始化的StringBuilder对象。然后使用其ToString()方法获取返回的字符串。