调用从c#到c++的外部方法

本文关键字:外部 方法 c++ 调用 | 更新日期: 2023-09-27 18:15:33

我编写了以下c++共享库:

#include "iostream"
#if defined(_WIN32) || defined(_WIN64)
    #define Q_DECL_EXPORT __declspec(dllexport)
    #define Q_DECL_IMPORT __declspec(dllimport)
#else
    #define Q_DECL_EXPORT
    #define Q_DECL_IMPORT
#endif
#ifdef MATINCHESS_LIBRARY
#  define MATINCHESS_API Q_DECL_EXPORT
#else
#  define MATINCHESS_API Q_DECL_IMPORT
#endif
using namespace std;
string* memory;
extern "C"
{
    MATINCHESS_API void Initialize();
    MATINCHESS_API void Uninitialize();
    MATINCHESS_API void Put(string text);
    MATINCHESS_API string Get();
    void Initialize()
    {
        memory = new string;
    }
    void Uninitialize()
    {
        delete memory;
    }
    void Put(string text)
    {
        memory->assign(text);
    }
    string Get()
    {
        return *memory;
    }
}

这是我的c#控制台应用程序:

using System;
using System.Runtime.InteropServices;
namespace MatinChess
{
    class MainClass
    {
        const string MatinChessDLL = "libMatinChessDLL.so";
        [DllImport(MatinChessDLL)]
        public static extern void Initialize();
        [DllImport(MatinChessDLL)]
        public static extern void Uninitialize();
        [DllImport(MatinChessDLL)]
        public static extern void Put(string text);
        [DllImport(MatinChessDLL)]
        public static extern string Get();
        public static void Main (string[] args)
        {
            Console.WriteLine ("Initializing...");
            Initialize ();
            Console.WriteLine ("Initialized");
            Console.WriteLine ("Write: ");
            Put (Console.ReadLine ());
            Console.WriteLine ("Value is put.");
            Console.WriteLine ("You wrote '"" + Get () + "'"");
            Console.ReadKey ();
            Console.WriteLine ("Uninitializing...");
            Uninitialize ();
            Console.WriteLine ("Uninitialized");
        }
    }
}

它安全地初始化并放入ReadLine中的字符串,但是当它想调用Get方法时,它崩溃并产生长堆栈跟踪。

请帮我找一下问题

调用从c#到c++的外部方法

不能将std::string从c++封送到c#。你必须使用字符缓冲区。参见这个问题:将字符串从c#传递到c++ dll并返回——最小示例