gpt4 book ai didi

c# - COM 接口(interface)声明

转载 作者:行者123 更新时间:2023-11-30 22:48:53 26 4
gpt4 key购买 nike

在 C# 中创建 COM 接口(interface)声明时,是否有必须遵守的“规则”?我认为有并且想获得一些关于它的信息。例如,我正在研究 ITaskbarList、ITaskbarList2 和 ITaskbarList3 接口(interface),在我看来,我

  • 必须完全按照成员在非托管接口(interface)声明中出现的顺序来声明管理实现中成员的顺序。

例如以下似乎工作得很好

[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);
}
  • 必须在单个托管接口(interface)声明中声明继承的非托管接口(interface),而不是在托管接口(interface)上使用继承。我想在它们自己的托管接口(interface)(带有 Guid 属性等)中声明每个非托管接口(interface),然后在它们之间使用继承,而不是在每个新接口(interface)中重新声明父级声明。

例如,这似乎不起作用

[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);
}

即在单个界面中声明它,同时仍然考虑成员顺序。

那么,为非托管对应物声明托管接口(interface)的准则是什么?有没有办法实现我想要的,它在托管端接口(interface)继承+以我想要的任何顺序声明成员(我真的只想按字母顺序对它们进行排序)

最佳答案

您的发现是由同一事物引起的:vtables。您无法更改 vtable 顺序,并且从其他接口(interface)继承的接口(interface)也始终具有 vtable 中的所有基本条目。因此,您正在寻找的规则是“确保 vtable 相同。”

关于c# - COM 接口(interface)声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com