我有一个用 C# 编写的 dll,并暴露给 COM。我在构建器中使用 dll ...我可以实例化该类,但在编组来自 C# 方法调用的返回值时遇到问题。
C#
public string GetValue([MarshalAs(UnmanagedType.LPWStr)] string key)
{
return "value";
}
导入构建器时的翻译函数:
virtual HRESULT STDMETHODCALLTYPE GetValue(LPWSTR key/*[in]*/,
BSTR* pRetVal/*[out,retval]*/) = 0;
我对C++知之甚少。'key' 参数可以很好地传递,因为我可以在参数上使用 'MarshalAs' 属性,但我要么不知道如何为返回值声明它,要么不知道如何调用C++ 端的函数(我已经尝试了几件事,只是猜测)。
更新:好的,我只是以安东的例子并尝试根据汉斯的评论进行修改来解决这个问题。Antons 的回答正如他所展示的那样工作,但由于对内存管理问题的担忧,我最终没有在 C# 中应用 return 属性,并且 C++ 代码调用该函数如下:
BSTR result;
obj->GetValue(key, &result);
SysFreeString(key);
SysFreeString(result);
我希望我能将这两个答案归功于帮助我解决这个问题,它们都是为我提供所需信息所必需的。