使用 c++ 中的字符串调用 C# 方法

Posted

技术标签:

【中文标题】使用 c++ 中的字符串调用 C# 方法【英文标题】:Call C# method with string from c++ 【发布时间】:2016-12-23 10:09:30 【问题描述】:

我知道以前有人问过类似的问题,但我就是无法让它发挥作用.. 我在 dll 中有一个 c# 函数。

    public int setUser(string str)

我从 C++ 调用它。 我尝试过这样的事情。

    long lResult = 0; 
    PWSTR pw = L"hello";
    pICalc->setUser(pw, &lResult);

但这似乎只是发送一个空字符串或一个空值。

调用该方法并发送该方法将获得的字符串的最简单方法是什么?

【问题讨论】:

你怎么称呼这个方法?你在使用 C++/CLI 吗?还是 COM? 你好我用COM 那么到底发生了什么?你在 C# 中得到null 吗?还是一个空字符串?如果不管输入如何都返回 42 会发生什么,这是否会导致返回 C++?你的 COM 接口是什么样子的?在 C# 和 C++ 中? 它是一个空字符串。是的,我可以毫无问题地在它们之间传递整数。只是字符串,我不明白如何开始工作。 关于界面我不太确定,我用这个教程让它工作:support.microsoft.com/en-us/kb/828736 【参考方案1】:

在 COM 中,字符串被封送为 BSTR,这与以 null 结尾的 C++ 字符串不同。在 C++ 中创建 BSTR 的最简单方法是使用 ATL 的 CComBSTR 类:

pICalc->setUser(CComBSTR(L"hello"), &lResult);

否则您可以使用 SysAllocString/SysFreeString 函数:

BSTR bstrString = ::SysAllocString(L"hello");
if (bstrString == NULL)
    // out of memory

pICalc->setUser(bstrString, &lResult);
::SysFreeString(bstrString);

【讨论】:

以上是关于使用 c++ 中的字符串调用 C# 方法的主要内容,如果未能解决你的问题,请参考以下文章

C# 调用非托管 C++ 返回平方符号字符串

从本机调用 C# 以检索字符串

从 C++ 库方法返回的“char*”获取 C# 字符串?

从 C++ 传递函数指针以由 C# 调用 - 函数参数包括宽字符字符串 (LPCWSTR)

C# 调用C++ DLL,而c++函数的有一个参数需要是null,该怎么传递?

使用来自 C++ dll 的 __declspec(dllexport) 签名声明在 C# 中调用的问题