使用DLL在c ++和C#之间交换字符串

时间:2017-06-14 12:18:12

标签: c# c++ dll

我正在寻找用我的c#表格交换我的c ++代码中的字符串。

这是我在C#程序中的代码:

[DllImport("libDLL.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern string valeurExpr(IntPtr pImg);

            public unsafe string objetLibValeurCarteExpr()
            {
                return valeurExpr(ClPtr);
            }

我的C ++程序中的代码:

IHM级

 class IHM {
 private:
        std::string             card_number_str;
        std::string             card_expr_str;
        std::string             card_porteur_str;

我的外部

extern "C" _declspec(dllexport) std::string valeurExpr(IHM* pImg) {     return pImg->lireExpr(); }

函数lireExpr()

 _declspec(dllexport) std::string lireExpr() const {
        return card_expr_str;
    }

当我执行Visual时,我说我试图访问受保护的内存部分。

1 个答案:

答案 0 :(得分:2)

首先,您希望可以从其他语言访问dll中的std::stringstd::wstring。所以这些研究员必须改为char *wchar_t *< ---这是真正的字符串 - 字符数组。

那么,如何从C ++到C#获取字符串?

C ++

void foo(char *str, int len)
{
    //write here content of string
}

C#

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(StringBuilder str, int len);

然后你必须以某种方式调用它:

void callFoo()
{
  StringBuilder sb = new StringBuilder(10); //allocate memory for string
  foo(sb, sb.Capacity);
}

请注意,在C#中,您必须使用StringBuilder从c ++中获取字符串。

如果你想以另一种方式传递字符串 - 从C#到C ++更简单: C ++

void foo(const char *str)
{
    //do something with this str
}

C#

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(string str);

然后只是:

void callFoo(string str)
{
   foo(str);
}

您必须记住代码页。因此,如果您使用的是unicodes,则必须为DllImport提供其他属性:CharSet = CharSet.Unicode

现在上课。没有简单的方法将C ++中定义的类传递给C#。简单的方法是做一些魔术。因此,对于C ++中的每个成员函数,都要创建将导出到dll的非成员函数。这样的事情:

//class in C++
class Foo 
{
public:
  int Bar();
};

//now you will have to define non member function to create an instance of this class:
Foo* Foo_Create() 
{ 
    return new Foo(); 
}

//and now you will have to create non member function that will call Bar() method from a object:
int Foo_Bar(Foo* pFoo) 
{ 
    return pFoo->Bar(); 
}

//in the end you will have to create a non member function to delete your object:
void Foo_Delete(Foo* pFoo) 
{ 
    delete pFoo; 
}

然后你可以在C#中使用它:

[DllImport("Foo.dll")]
public static extern IntPtr Foo_Create();

[DllImport("Foo.dll")]
public static extern int Foo_Bar(IntPtr value);

[DllImport("Foo.dll")]
public static extern void Foo_Delete(IntPtr value);

你也可以在C ++中使用C#类,但它有点复杂,需要使用C ++ / CLI