【问题标题】:Convert C# string to C++ WCHAR* over COM通过 COM 将 C# 字符串转换为 C++ WCHAR*
【发布时间】:2015-05-03 12:58:44
【问题描述】:

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

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

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

C# 非常简单:

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

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

【问题讨论】:

  • 您使用的是什么版本的 C#?例如。你可以访问dynamic吗?
  • 4,所以我可以访问dynamic。当我将动态字符串传递给该方法时,我得到:An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll Additional information: 'object' does not contain a definition for 'Foo' 我猜这是因为该方法的版本没有接受字符串。
  • 您试图在什么对象上调用Foo 方法?您能否发布实际的方法调用。
  • @ShaunLuttin,我在问题中添加了方法调用。
  • 好,那么在界面中使用BSTR 会好很多。整体上更容易编组,C# 将通过String 那里,而无需您付出任何努力。

标签: c# c++ string com interop


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 同样的问题,客户端连接到 COM 服务器正常,但我在“匿名托管的 DynamicMethods 程序集”中得到 An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll Additional information: 'object' does not contain a definition for 'Foo'
  • 我假设 object 在这种情况下是一个实例 IFooService。你确定它有一个Foo 方法并且那个方法是一个实例方法吗?
  • 这在我头上 :-)。
  • 感谢您的建议。我今天学习了动态类型! :)
【解决方案2】:

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

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

    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,因为它是最简单的,并且不需要向客户端添加一堆额外的代码。

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 2023-03-27
    • 2012-07-26
    • 2013-10-22
    • 2011-02-03
    • 2018-09-02
    • 2010-10-26
    • 2014-07-31
    • 2011-06-17
    相关资源
    最近更新 更多