繁体   English   中英

使用托管c ++包装器将字符串从c#传递到非托管c#

[英]pass string from c# to unmanaged c# using managed c++ wrapper

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

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

提前致谢。 丰富

假设非托管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 ++代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM