如何将字符串从C#DLL传递到非托管语言(例如C+;+;)中?
我很幸运地使用Robert Giesecke的精彩的“”库在Fortran(不问!:-)和C#之间进行了互操作。然而,我还没有实现的一件事是将字符串从C#发送到Fortran。最糟糕的是,我没有任何迹象表明出了什么问题。我的Fortran应用程序刚刚崩溃。我已经将这个问题发布到我所知道的最流行的Fortran论坛(),到目前为止,它已经引起了很多讨论,但我还没有接近解决这个问题。我现在在想,如果我能用C/C++来解决这个问题,也许我可以更容易地将这个解决方案转换成Fortran 根据我所做的所有研究,在我看来,像以下这样的东西应该是可行的:如何将字符串从C#DLL传递到非托管语言(例如C+;+;)中?,c#,c++,string,unmanaged,dllexport,C#,C++,String,Unmanaged,Dllexport,我很幸运地使用Robert Giesecke的精彩的“”库在Fortran(不问!:-)和C#之间进行了互操作。然而,我还没有实现的一件事是将字符串从C#发送到Fortran。最糟糕的是,我没有任何迹象表明出了什么问题。我的Fortran应用程序刚刚崩溃。我已经将这个问题发布到我所知道的最流行的Fortran论坛(),到目前为止,它已经引起了很多讨论,但我还没有接近解决这个问题。我现在在想,如果我能用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++编写一个非常简单的控制台应用程序,调用上面的“GetStruct”方法并获取包含字符串的结构吗
注1:我几乎尝试了“UnmanagedType”的每一种排列,也尝试了“string”和“char[]”这两种排列,但运气都不好,因此尽管在本例中我可能没有这样的权利,但请不要推荐其中一种,除非您能证明它是有效的。:-)
注2:我在本主题中发现的绝大多数线程都以另一种方式发送字符串(即从非托管DLL发送到托管应用程序,而不是从非托管应用程序发送到托管DLL)。我对这些不感兴趣,因为我的工作很有魅力。:-) C++代码对您毫无帮助,您必须处理Fortran编译器的功能。两个关键问题。如果挂起并泄漏字符串指针,则必须使用UnmanagedType.ByValArray,但您已经知道了这一点。返回结构的函数非常易变,没有标准的ABI。重写为void GetStruct(out MyStruct retval)。如果这仍然不起作用,那么不要犹豫,简化,你也可以暴露三个函数,每个函数返回一个值,现在你试图把它放到结构中,这是COM接口工作的基本方式。@汉斯-我只是希望也许一些C++代码可能会产生一些我还没尝试过的想法。请参阅我在原始帖子中引用的线程,了解我提出的解决方案。因此,您开始将其作为参数而不是返回值传递,然后它开始工作了?当然只需发布答案并接受它来完成这个Q+A.C++代码,对你来说根本没什么帮助,你必须处理你的FORTRAN编译器能做的事情。两个关键问题。如果挂起并泄漏字符串指针,则必须使用UnmanagedType.ByValArray,但您已经知道了这一点。返回结构的函数非常易变,没有标准的ABI。重写为void GetStruct(out MyStruct retval)。如果这仍然不起作用,那么不要犹豫,简化,你也可以暴露三个函数,每个函数返回一个值,现在你试图把它放到结构中,这是COM接口工作的基本方式。@汉斯-我只是希望也许一些C++代码可能会产生一些我还没尝试过的想法。请参阅我在原始帖子中引用的线程,了解我提出的解决方案。因此,您开始将其作为参数而不是返回值传递,然后它开始工作了?当然只需发布答案并接受即可完成此问答。