C# 调用了错误的重载方法

C# 调用了错误的重载方法,c#,marshalling,overloading,C#,Marshalling,Overloading,我已经用C#编写了COM组件。接口方法的声明方式如下: [ComImport, Guid("7D37EE00-143E-40DF-B177-BF091D7CD36A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMonogramServiceHost { void Send( [In, MarshalAs(UnmanagedType.BStr)] stri

我已经用C#编写了COM组件。接口方法的声明方式如下:

[ComImport,
    Guid("7D37EE00-143E-40DF-B177-BF091D7CD36A"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMonogramServiceHost
{
    void Send(
        [In, MarshalAs(UnmanagedType.BStr)] string text);

    void Send([In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]byte[] data,
        [In, MarshalAs(UnmanagedType.I4)] int length);
}

这些方法是从C++代码调用的。在C++中声明的这个接口是:

DECLARE_INTERFACE_(IMonogramServiceHost, IUnknown)
{
    STDMETHOD(Send)(BSTR text);
    STDMETHOD(Send)(uint8 *buf, int length);
};
我叫第二种方法。它的参数只是无符号字符数组,其长度由参数“length”定义。由于某些未知原因,代码步进方法“void Send(字符串文本)”。从COM方法返回后,调试器显示以下错误消息:

运行时检查失败#0-未在函数调用中正确保存ESP的值。这通常是调用使用一个调用约定声明的函数以及使用另一个调用约定声明的函数指针的结果


当我将方法重命名为A时,将调用正确的版本。为什么会这样?我看不出其中的逻辑。

COM不支持函数重载。现在还不清楚您是如何进行调用的,但是后期绑定肯定会失败。IDispatch::GetIDsOfNames()在请求“发送”时将返回错误的dispid。在本例中,这并不是很明显,因为您来自IUnknown。但就其本身而言,有足够的理由给这些方法起不同的名字


我建议使用SendText和SendBytes。它本身是合理的,字节和字符在Unicode中根本不等价。

< P> A C.Car char数组是C++ UIT16数组,而不是UIT8数组。第二个签名不匹配。

我不需要传递unicode字符串,只需传递包含任意数据的缓冲区即可。对于unicode字符串,我使用的是第一种方法,我使用的不是字符数组,而是8位宽度的字节数组。