Dllimport将字符串从C#传递给C ++

时间:2012-11-22 14:14:46

标签: 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*吗?

2 个答案:

答案 0 :(得分:0)

错误的决定

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-。

答案 1 :(得分:-1)

我建议使用char *。这是一个可能的解决方案。

如果您创建另一个C#函数ToUpper_2,如下所示

C#方:

[DllImport("TestDll.dll"), CallingConvention = CallingConvention.Cdecl]
private static extern IntPtr ToUpper(string s);

public static string ToUpper_2(string s) 
{
    return Marshal.PtrToStringAnsi(ToUpper(string s));
}

C ++方面:

#include <algorithm>
#include <string>

extern "C" __declspec(dllexport) const char* ToUpper(char* s) 
{
    string tmp(s);

    // your code for a string applied to tmp

    return tmp.c_str();
}

你完成了!