При создании объявлений COM-интерфейса на С# существуют ли какие-либо «правила», которых вы должны придерживаться? Я думаю, что есть и хотел бы получить некоторую информацию о нем. Например, я играюсь с интерфейсами ITaskbarList, ITaskbarList2 и ITaskbarList3, и мне кажется, что я
- Необходимо объявить порядок элементов в управляемой реализации точно в том порядке, в котором они появляются в объявлении неуправляемого интерфейса.
Например, следующее работает нормально
[ComImport]
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList
{
void HrInit();
void AddTab([In] IntPtr hwnd);
void DeleteTab([In] IntPtr hwnd);
void ActivateTab([In] IntPtr hwnd);
void SetActiveAlt([In] IntPtr hwnd);
}
При изменении порядка членов нарушается функциональность
[ComImport]
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList
{
void DeleteTab([In] IntPtr hwnd);
void HrInit();
void AddTab([In] IntPtr hwnd);
void SetActiveAlt([In] IntPtr hwnd);
void ActivateTab([In] IntPtr hwnd);
}
- Необходимо объявлять унаследованные неуправляемые интерфейсы в одном объявлении управляемого интерфейса вместо использования наследования для управляемых интерфейсов. Я хочу объявить каждый из неуправляемых интерфейсов в своем собственном управляемом интерфейсе (в комплекте с атрибутами Guid и т. д.) и использовать наследование между ними вместо повторного объявления родительских объявлений в каждом новом интерфейсе.
Например, это не работает
[ComImport]
[Guid("56FDF342-FD6D-11D0-958A-006097C9A090")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList
{
void HrInit();
void AddTab([In] IntPtr hwnd);
void DeleteTab([In] IntPtr hwnd);
void ActivateTab([In] IntPtr hwnd);
void SetActiveAlt([In] IntPtr hwnd);
}
[ComImport]
[Guid("602D4995-B13A-429B-A66E-1935E44F4317")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList2
: ITaskbarList
{
void MarkFullscreenWindow(
[In] IntPtr hwnd,
[In, MarshalAs(UnmanagedType.Bool)] bool fullscreen);
}
Вместо этого я вынужден сделать следующее
[ComImport]
[Guid("602D4995-B13A-429B-A66E-1935E44F4317")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITaskbarList2
{
void HrInit();
void AddTab([In] IntPtr hwnd);
void DeleteTab([In] IntPtr hwnd);
void ActivateTab([In] IntPtr hwnd);
void SetActiveAlt([In] IntPtr hwnd);
void MarkFullscreenWindow(
[In] IntPtr hwnd,
[In, MarshalAs(UnmanagedType.Bool)] bool fullscreen);
}
То есть объявить его в одном интерфейсе, при этом принимая во внимание порядок членов.
Итак, каковы рекомендации по объявлению управляемых интерфейсов для их неуправляемых аналогов? Есть ли способ добиться того, чего я хочу, это наследование интерфейса на управляемой стороне + объявление членов в любом порядке, который я хочу (я действительно просто хочу отсортировать их по алфавиту)