我目前有一个简单的非托管C ++方法,它只显示一个messageBox。我为此创建了一个托管的c ++包装器,然后我在我的c#应用程序中引用它。 我需要能够将c#中的字符串和其他变量传递给非托管的c ++,然后再返回,但是由于我的c ++知识非常基础,我在转换字符串方面遇到了麻烦。
我的最终目标是能够通过我的新c#app(不使用DLLImport或COM)从我们的旧版非托管c ++库中调用复杂的函数,但我想在进行之前创建一个简单的示例。
提前致谢。 富
答案 0 :(得分:0)
假设非托管C ++方法看起来像这样:
namespace UnmanagedCpp
{
class MessageBox
{
public:
static void Show(LPCTSTR lpszMessage)
{
::MessageBoxW(NULL, lpszMessage, L"Message", 0);
}
};
}
你可以把它包装成这样的东西:
using namespace System::Runtime::InteropServices;
namespace ManagedCpp
{
public ref class MessageBox
{
public:
static void Show(String^ message)
{
#if defined(UNICODE) || defined(_UNICODE)
IntPtr intPtr = Marshal::StringToHGlobalUni(message);
#else
IntPtr intPtr = Marshal::StringToHGlobalAnsi(message);
#endif
UnmanagedCpp::MessageBox::Show(static_cast<LPTSTR>(intPtr.ToPointer()));
Marshal::FreeHGlobal(intPtr);
}
};
}
如果您计划在C#和C ++之间进行更广泛的互操作,我建议使用COM,因为它不需要您编写任何包装器(在更复杂的情况下会变得非常混乱),当然它需要您修改现有的C ++代码。