通过 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);
看起来这个问题至少有两个解决方案。
在 IDL 中的参数中添加 string attribute 以将指针视为字符串,因此:
HRESULT Foo([in] const WCHAR* bar);
变成这样:
HRESULT Foo([in, string] const WCHAR* bar);
然后,可以将字符串从 C# 传递到方法。
按照 http://www.moserware.com/2009/04/using-obscure-windows-com-apis-in-net.html 处的说明进行操作,并使用恰当命名的 ComImport
属性来声明接口,并在字符串参数前加上 [MarshalAs(UnmanagedType.LPWStr)]
.
我选择了 #1,因为它最简单,并且不涉及向客户端添加一堆额外的代码。
我有一个 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);
看起来这个问题至少有两个解决方案。
在 IDL 中的参数中添加 string attribute 以将指针视为字符串,因此:
HRESULT Foo([in] const WCHAR* bar);
变成这样:
HRESULT Foo([in, string] const WCHAR* bar);
然后,可以将字符串从 C# 传递到方法。
按照 http://www.moserware.com/2009/04/using-obscure-windows-com-apis-in-net.html 处的说明进行操作,并使用恰当命名的
ComImport
属性来声明接口,并在字符串参数前加上[MarshalAs(UnmanagedType.LPWStr)]
.
我选择了 #1,因为它最简单,并且不涉及向客户端添加一堆额外的代码。