Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字符串从C#DLL传递到非托管语言(例如C+;+;)中?_C#_C++_String_Unmanaged_Dllexport - Fatal编程技术网

如何将字符串从C#DLL传递到非托管语言(例如C+;+;)中?

如何将字符串从C#DLL传递到非托管语言(例如C+;+;)中?,c#,c++,string,unmanaged,dllexport,C#,C++,String,Unmanaged,Dllexport,我很幸运地使用Robert Giesecke的精彩的“”库在Fortran(不问!:-)和C#之间进行了互操作。然而,我还没有实现的一件事是将字符串从C#发送到Fortran。最糟糕的是,我没有任何迹象表明出了什么问题。我的Fortran应用程序刚刚崩溃。我已经将这个问题发布到我所知道的最流行的Fortran论坛(),到目前为止,它已经引起了很多讨论,但我还没有接近解决这个问题。我现在在想,如果我能用C/C++来解决这个问题,也许我可以更容易地将这个解决方案转换成Fortran 根据我所做的所有

我很幸运地使用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++代码可能会产生一些我还没尝试过的想法。请参阅我在原始帖子中引用的线程,了解我提出的解决方案。因此,您开始将其作为参数而不是返回值传递,然后它开始工作了?当然只需发布答案并接受即可完成此问答。