2014-02-10 34 views
2

我正在嘗試使用Fortran庫中的函數。該函數應該返回一個字符串。如果我用這個VB.Net:DllImport和Declare語句中的差異

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始終是空白。

任何人都可以指出兩者之間的區別。我寧願使用第二個定義,因爲它允許我通過使用常量來設置庫。

回答

2

聲明聲明是在VB.NET中採用的傳統語法,用於處理它在VB6時代的工作方式。在你的情況下,它確實重要的一件事是它允許將本地代碼寫入到字符串中。就像它可能回到VB6。在.NET中這是完全無效的,字符串是不可變的。

<DllImport>聲明中的完全等效。將<MarshalAs(UnmanagedType.VBByRefStr)> ByRef cLabel As String

更好的解決方案是聲明參數作爲ByVal cLabel As StringBuilder並傳遞一個正確初始化StringBuilder對象以足夠的容量。然後使用它的ToString()方法獲取返回的字符串。