将BSTR从C++传递到C#

Pass BSTR from C++ to C#

本文关键字:C++ BSTR      更新时间:2023-10-16

我有C#项目"X",我在其中向C++项目"Y"公开了方法。

X的方法签名如下-

public void WriteInformation(string sInfo)
{
    m_logger.ErrorInfo("{0}", sInfo);
}

当我使用.TLB文件将其导出到C++时,我检查了.tlh文件中该方法的声明,该文件在.TLB文件的#import中生成。

virtual HRESULT __stdcall WriteInformation ( /*[in]*/ BSTR sMsg ) = 0;

我在C++项目中调用这个方法,并传递如下参数-

oLog->WriteInformation(BSTR("Info write successful"));

这里的问题是,从C++传递的字符串总是变成垃圾或null,我调试了它,我可以看到sInfo的值总是垃圾或null。

请告诉我应该使用什么方法将字符串从C++传递到C#。

您尝试传递ANSI字符串来代替BSTR。BSTR必须是宽字符串。此外,您不应该传递字符串文字,您应该使用SysAllocString()(或者更好的是)像ATL::CComBSTR_bstr_t这样的包装类来正确分配BSTR。Btw _bstr_t有一个构造函数,它将接受const char*并为您执行ANSI->UTF16转换。

我认为不可能直接与C++和C#交互。我使用C++/CLI包装器进行了交互。