【问题标题】:VB.NET print pointer of COM ObjectsCOM 对象的 VB.NET 打印指针
【发布时间】:2026-01-29 13:50:01
【问题描述】:

我想打印用 DLL 导入的 .NET 编译对象的内存地址。 固定对象的代码是(谷歌搜索):

' dim managed variable
Dim primitiveObject As String="HELLO WORLD"
' pin variable and create
' GC handle instance
Dim gh As GCHandle = GCHandle.Alloc(primitiveObject , GCHandleType.Pinned)
' get address of variable
Dim AddrOfMyString As IntPtr = gh.AddrOfPinnedObject()
Console.WriteLine(AddrOfMyString.ToString())
' free the handle and unpin variable
gh.Free()

这段代码完美运行,但我的 .NET 编译对象不是原始类型。

Dim myComObject as New MyDLL.MyNETObject

如何打印 myComObject 内存地址? 提前谢谢...

【问题讨论】:

    标签: .net vb.net visual-studio interop marshalling


    【解决方案1】:

    COM 的一个核心特性是COM 接口的实现是完全不可见的。只有接口指针才有意义,以 IUnknown* 开头。从技术上讲,您可以从接口指针中看到方法指针,但它们很可能指向接口的代理,即与世界各地的另一台机器通信的代码。

    Marshal.GetObjectForIUnknown() 可能看起来很吸引人,但它代表的是 Runtime Callable Wrapper 实例,而不是实际的 COM 对象。

    因此你不应该尝试获取这样的“内存地址”,它没有任何意义。就此而言,就像不再固定的托管对象的地址一样毫无意义。

    【讨论】:

      最近更新 更多