Я написал компонент COM в C #.Методы интерфейса объявляются следующим образом:
[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 (string text)'.После возврата из COM-метода отладчик отображает следующее сообщение об ошибке:
Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции.Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах, с указателем функции, объявленным с другим соглашением о вызовах.
Когда я переименовываю метод в AS, вызывается правильная версия.Почему это происходит?Я не вижу в этом логики.