如何使用CHARACTER * 50类型的参数将参数从C#传递给FORTRAN?

我有以下FORTRAN:

SUBROUTINE MYSUB(MYPARAM) !DEC$ ATTRIBUTES DLLEXPORT::SetPaths CHARACTER*50 MYPARAM WRITE(6, *) MYPARAM END SUBROUTINE 

然后我在C#中有以下内容

 class Program { static void Main(string[] args) { StringBuilder sb = new StringBuilder(50); sb.Append(@"something"); MYSUB(sb); Console.ReadLine(); } [DllImport(@"myCode.dll", EntryPoint = "MYSUB")] public static extern void MYSUB(StringBuilder input); } 

然而,我的FORTRAN中的WRITE在“某事”之后显示了一堆垃圾。 看起来字符串终止符没有被尊重。 救命!

字符串是在不同语言之间交换的最棘手的数据类型。

基本的Fortran字符串是固定长度,末端用空格填充。 (Fortran现在有可变长度的字符串,但那些更难以交换。)内在的“修剪”用于抑制尾随空白; “len_trim”提供的长度减去尾随空白。

C标记带有空字符的字符串的结尾。

我不知道C#如何处理字符串 – 一个内部变量的长度? 一个终结者?

但是Fortran不会理解C#的表示,它只会看到声明的字符串的全长,在这种情况下,包括未初始化的内存。 最好的解决方案可能是将字符串的剩余部分初始化为C#中的空白。