c# - Dllimport 将字符串从 C# 传递到 C++

标签 c# c++ string dllimport

我正在尝试使用平台调用将字符串从 C# 传递到 C++。

  • C++代码:

    #include<string>
    using namespace std;
    
    extern "C" 
    {
         double __declspec(dllexport) Add(double a, double b)
         {
             return a + b;
         }
         string __declspec(dllexport) ToUpper(string s)
         {
             string tmp = s;
             for(string::iterator it = tmp.begin();it != tmp.end();it++)
                 (*it)-=32;
             return tmp;
         }
    }
    
  • C#代码:

    [DllImport("TestDll.dll", CharSet = CharSet.Ansi, CallingConvention =CallingConvention.Cdecl)]
    public static extern string ToUpper(string s); 
    
    static void Main(string[] args)
    {
        string s = "hello";
        Console.WriteLine(Add(a,b));
        Console.WriteLine(ToUpper(s));
    }
    

我收到一个 SEHException。像这样使用 std::string 是不可能的吗?我应该改用 char* 吗?

最佳答案

正确的决定

C# 端:

[DllImport("CppDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GetString(string s);

public string GetString_(string s)
{            
    var ptr = GetString(s);                                
    var answerStr = Marshal.PtrToStringAnsi(ptr);
    return answerStr;
}

C++ 方面:

extern "C" __declspec(dllexport) const char* GetString(char* s)
{       
    string workStr(s);      
    int lenStr = workStr.length() + 1;
    char* answer = new char[lenStr];
    const char * constAnswer = new char[lenStr];
    strcpy(answer, workStr.c_str());
    constAnswer = answer;
    return constAnswer;
}

并在cpp项目的设置中禁用/sdl-。

关于c# - Dllimport 将字符串从 C# 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13514560/

相关文章:

c# - 从代码隐藏更改母版页上的 DIV 标签高度

c# - Windows.Forms SplitContainer.SplitterWidth 不会在运行时保持设置

c# - 将信号从一个 winforms 应用程序发送到另一个

c++ - Qt TableView去除奇怪的方框

c# - 动态单选按钮将添加的列表项设置为选中

c++ - 逗号运算符如何工作

c++ - 查找库中的所有动态初始化

string - 如何在Lua中实现string.rfind

regex - 是否有一个正则表达式可以从字符串中返回与给定的特定子字符串列表不匹配的子字符串?

c - 如何从文件中获取字符串并存储在二维字符数组中,并将该二维字符数组与 C 中的字符串进行比较?