我有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 ++传递的字符串总是变成垃圾或空,我调试了它,我可以看到sInfo的值总是垃圾或空。
请让我知道将字符串从C ++传递到C#应遵循的方法。
答案 0 :(得分:3)
您尝试传递ANSI字符串代替BSTR。 BSTR必须是宽字符串。此外,您不应传递字符串文字,您应该使用SysAllocString()
(或更好)包装类(ATL::CComBSTR
或_bstr_t
)正确分配BSTR。顺便说一句_bstr_t
有一个接受const char*
的构造函数,并为您执行ANSI-> UTF16转换。
答案 1 :(得分:-2)
我认为不可能直接与C ++和C#交互。我使用C ++ / CLI包装器进行了交互。