1

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

我第一次尝试Dim txt(50) as Char在 VB2010 和 character*50 txtDVF F90 DLL 中使用,但没有成功。

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

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

4

2 回答 2

1

好吧,我用 C# 做到了,这很简单:

FORTRAN 代码(康柏 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);

但我不能进行任何更改并返回字符串(还)。也许这足以让你继续前进。

于 2011-08-03T19:00:04.813 回答
0

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

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

于 2011-08-03T17:12:14.297 回答