gpt4 book ai didi

c# - COM 是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 11:26:39 30 4
gpt4 key购买 nike

我有一个据称是 COM 对象的 dll。我试图了解当 dll 中没有可用的导出函数时,CLR 究竟是如何确定要调用哪个函数的(我使用 depends 进行了检查)。

  [Guid("DEADBEEF....")]
[TypeLibType(...)]
[ComImport]
public interface ISomething
{
[DispId(1)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[return: MarshalAs(UnmanagedType.IDispatch)]
object DoSomething([MarshalAs(UnmanagedType.IDispatch), In] object something);

在这里,我检查了 MSIL,没有关于它位于什么地址或函数名称或偏移量的信息。

此外,似乎没有关于对象如何布局以便传递其 vtable 指针等信息。

这是什么魔法?

最佳答案

在(非托管)代码中,可以在与 COM 对象关联的“类型库”文件上使用 LoadTypeLib/LoadTypeLibEx。很常见的是,这是为 COM 对象本身注册的 EXE 或 DLL(但它也可以是独立的 TLB 文件、外部类型库等)。 LoadTypeLib 的文档在 https://msdn.microsoft.com/en-us/library/windows/desktop/ms221027(v=vs.85).aspx 处有进一步的指示。 .

获得 ITypeLib/ITypeLib2 类型库接口(interface)后,它会提供所有 COM 对象信息,包括接口(interface)、vtable 布局、原型(prototype)等。完整文档位于 https://msdn.microsoft.com/en-us/library/windows/desktop/ms221549(v=vs.85).aspx。 .

LoadTypeLib 的一个实际应用示例是随大多数版本的 Visual Studio 一起提供的 OLE/COM 对象查看器,它基本上可以将给定的类型库反编译回 IDL。我不能发布超过 2 个 URL,但查找 https-//msdn.microsoft.com/en-us/library/d0kh9f4c.aspx。

在托管代码中,编译器透明地导入类型库,尽管在幕后它基本上做与 OLE/COM 查看器相同的工作,外加添加必要的托管包装器。有关详细信息,请参阅 https-//msdn.microsoft.com/en-us/library/xwzy44e4(v=vs.110).aspx。

关于c# - COM 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33620307/

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