超头痛的问题(如何获取托管类型变量的地址)

showname 2008-10-14 02:06:32
class Node
{
public Point Data;
public Node next;
}

Node n=new Node();
Node * pN=&n;
这样会提示错误..不能获取托管类型的地址...

如题... 估计没有人会..
...全文
158 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaomin98 2010-04-26
  • 打赏
  • 举报
回复
1.C#中的指针。
在C#中,可以用unsafe代码使用指针。但是,指针只能指向值类型,不能指向引用类型。参考http://msdn.microsoft.com/zh-cn/library/y31yhkeb(v=VS.80).aspx
如果你的类是个轻量型的,可以考虑把该类写成struct,就可以用*操作符直接获取地址。
2.IntPtr类型。
在System.Runtime.InteropServices名称空间里,有一些用于
在托管内存与非托管内存之间互操作的类。Marshal.GetIUnknownForObject()。一般用于调用com对象。比如activex对象。参考http://www.wangchao.net.cn/bbsdetail_577247.html
但是关键看你要获取对象地址的用途是什么。托管对象每次垃圾回收极可能进行内存搬运,地址都会发生改变。
消失的尘芥 2008-10-14
  • 打赏
  • 举报
回复
wartim 2008-10-14
  • 打赏
  • 举报
回复
不知道这个算不算,字面意思是返回一个IUnkown指针,每次创建实例后分配的都不一样


namespace WindowsApplication6
{
class Node
{
public Point Data;
public Node next;
}

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Node n = new Node();
IntPtr P = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(n);
MessageBox.Show(P.ToString());
n = new Node();
P = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(n);
MessageBox.Show(P.ToString());
n = new Node();
P = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(n);
MessageBox.Show(P.ToString());
n = new Node();
P = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(n);
MessageBox.Show(P.ToString());
n = new Node();
P = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(n);
MessageBox.Show(P.ToString());
}
}
}

CsToD 2008-10-14
  • 打赏
  • 举报
回复
第一:必须在不安全上文中才能获得地址
第二:貌似只有值类型才能获得地址(Point是值类型,Node应该是个引用类型吧)
引用类型存在于托管堆上,应该不能获取
宝_爸 2008-10-14
  • 打赏
  • 举报
回复
.net 运行时可能会移动对象在内存中的位置,因此取得地址也没办法操作。

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧