如何将字符串从Visual Basic 2010传递到Fortran DLL?

时间:2011-08-03 15:51:06

标签: vb.net string dll fortran fortran90

我可以毫无问题地来回传递所有这些的整数,单数,双数和数组。但我无法弄清楚如何将Visual Basic 2010中的字符串传递给Fortran DLL中的字符变量。我一直收到PInvokeStackImbalance错误。我可以将Visual Basic字符串转换为包含每个字符的ASCII代码的整数数组,发送它,然后转换回DLL内部,但这是可悲的。必须有一个简单的方法来做到这一点。

我首先尝试在VB2010中使用Dim txt(50) as Char,在DVF F90 DLL中使用character*50 txt,但这不起作用。

然后我在Visual Basic 2010中尝试Dim txt as String并将字符串设置为50个字符(也尝试了49个字符),但这不起作用。

我希望那里的其他人想要将文件名等传递给他们的DLL。

2 个答案:

答案 0 :(得分:1)

我用C#做过,很简单:

FORTRAN CODE(Compaq Visual Fortran)

SUBROUTINE TEST_STR(A, N)
!DEC$ ATTRIBUTES DLLEXPORT :: TEST_STR
!DEC$ ATTRIBUTES ALIAS:'TEST_STR' :: TEST_STR
!DEC$ ATTRIBUTES VALUE :: N
    INTEGER*4, INTENT(IN) :: N
    CHARACTER(LEN=N) :: A

    PRINT '(1X,A)', "STRING RECEIVED:"
    PRINT '(1X,A8, A50)', "VALUE=", A

END SUBROUTINE

.NET代码(C#2008)

[DllImport("mathlib.dll")]
static extern void TEST_STR(string A, int n);
...
string S = new string('@', 50);
TEST_STR(S, S.Length);

但是我无法进行任何更改并返回字符串(还)。也许这足以让你前进。

答案 1 :(得分:0)

您是否尝试在P / Invoke中指定<MarshalAs(UnmanagedType.LPStr)>

Public Declare Auto Sub YOUR_SUB Lib "YOUR_DLL.Dll" (<MarshalAs(UnmanagedType.LPStr)> YOUR_VARIABLE As String)

更多相关内容:

http://msdn.microsoft.com/en-us/library/s9ts558h%28VS.71%29.aspx

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute%28VS.80%29.aspx