通过 COM 将 C# 字符串转换为 C++ WCHAR*

Convert C# string to C++ WCHAR* over COM

我有一个 COM 本地服务器(用 C++ 实现),我正试图从 C# 代码调用它。给我带来麻烦的方法如下所示:

HRESULT Foo([in] const WCHAR* bar);

参数在 C# 端显示为 ref ushort,但我想将字符串传递给方法,而不是数字。如何让此方法接受来自 C# 的字符串?

C# 非常简单:

IFooService service = new IFooService();
service.Foo("blah blah");

我看到其他答案描述了 DllImport 函数,然后在参数上使用 [MarshalAs(UnmanagedType.LPWStr)],但是由于 COM 服务器是 运行 作为本地服务器(这意味着它是独立的 exe 而不是 dll),并且它是界面的一部分,我认为我不能 DllImport 它。我需要用服务器的代理 dll 做些什么吗?

你可以试试这个:

dynamic bar = "blah blah blah";
IFooService service = new IFooService();
service.Foo(bar);

看起来这个问题至少有两个解决方案。

  1. 在 IDL 中的参数中添加 string attribute 以将指针视为字符串,因此:

    HRESULT Foo([in] const WCHAR* bar);
    

    变成这样:

    HRESULT Foo([in, string] const WCHAR* bar);
    

    然后,可以将字符串从 C# 传递到方法。

  2. 按照 http://www.moserware.com/2009/04/using-obscure-windows-com-apis-in-net.html 处的说明进行操作,并使用恰当命名的 ComImport 属性来声明接口,并在字符串参数前加上 [MarshalAs(UnmanagedType.LPWStr)].

我选择了 #1,因为它最简单,并且不涉及向客户端添加一堆额外的代码。