1

我目前有一个简单的非托管 C++ 方法,它只显示一个消息框。我为此创建了一个托管 c++ 包装器,然后在我的 c# 应用程序中引用它。我需要能够将字符串和其他变量从 c# 传递到非托管 c++ 并再次返回,但是由于我的 c++ 知识非常基础,因此在转换字符串时遇到了麻烦。

我的最终目标是能够通过我的新 c# 应用程序(不使用 DLLImport 或 COM)从我们遗留的非托管 c++ 库中调用复杂的函数,但我试图在继续之前创建一个简单的示例。

提前致谢。富有的

4

1 回答 1

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++ 代码。

于 2013-02-08T14:13:59.357 回答