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

时间:2016-10-21 06:31:50

标签: c# c++ string unmanaged dllexport

我使用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)。我对那些不感兴趣,因为我的工作就像一个魅力。 : - )

0 个答案:

没有答案