我使用Robert Giesecke的精彩" Unmanaged Exports&#34在Fortran(不要问!:-)和C#之间进行互操作有很多好运。 ;图书馆。但是,我还没能实现的一件事就是从C#向Fortran发送一个字符串。最糟糕的是,我没有得到什么错误的迹象。我的Fortran应用程序崩溃了。我已将这个问题发布到我所知道的最受欢迎的Fortran论坛(here),到目前为止它已经引起了很多讨论,但我还没有更接近解决问题。我现在想,如果我能用C / C ++解决它,也许我可以更容易地将这个解决方案转移到Fortran上。
从我所做的所有研究中,在我看来,以下内容应该有效:
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace CSharpDll
{
public class Structures
{
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.LPStr)]
public string Title;
public int SourceNode;
public int EndNode;
}
[DllExport("GetStruct", CallingConvention = CallingConvention.Cdecl)]
public static MyStruct GetStruct()
{
var result = new MyStruct();
result.Title = "This is the title";
result.SourceNode = 123;
result.EndNode = 321;
return result;
}
}
}
不幸的是,我的C / C ++甚至比我的Fortan更生气。我不知道如何在这方面做这项工作。有人可以帮我写一个非常简单的C / C ++控制台应用程序,它将调用上面的#34; GetStruct"方法并获得包含字符串的结构?
注1:我已经尝试了几乎所有的排列" UnmanagedType"以及" string"和" char []"没有运气,所以在这个例子中我可能没有那个权利,请不要建议其中一个,除非你能证明它有效。 : - )
注意2:我在本主题周围找到的绝大多数线程以其他方式发送字符串(即从非托管DLL到托管应用程序,而不是从非托管应用程序发送到托管DLL)。我对那些不感兴趣,因为我的工作就像一个魅力。 : - )