1

我想打印用 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 Compiled 对象不是原始类型。

Dim myComObject as New MyDLL.MyNETObject

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

4

1 回答 1

2

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

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

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

于 2013-05-22T15:48:46.180 回答