使用unsafe将指向CLR类型的指针指定为void *?

时间:2010-02-02 13:33:22

标签: c# .net c++-cli

有没有办法将CLR类型的指针分配给C#void*块中的unsafe

var bar = 1;
var foo = new Foo();

unsafe
{
    void* p1 = &bar;
    void* p2 = &foo; // fails at compile time
}

或者这只能使用C ++ / CLI:

System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder();
void* p1 = &sb; 

找不到任何方法让它在C#中起作用

2 个答案:

答案 0 :(得分:3)

根据MSDN documentation

  

以下任何类型都可能是a   指针类型:

     
      
  • sbyte,byte,short,ushort,int,uint,long,ulong,char,float,
      double,decimal或bool。
  •   
  • 任何枚举类型。
  •   
  • 任何指针类型。
  •   
  • 包含非托管类型字段的任何用户定义的结构类型   仅
  •   

没有办法指向类的实例(例如指向System.Text.StringBuilder实例的指针),尽管你可以在fixed上下文中有一个指向类成员的指针,如在以下代码中:

class Test
{
static int x;
int y;
unsafe static void F(int* p) {
    *p = 1;
}
static void Main() {
    Test t = new Test();
    int[] a = new int[10];
    unsafe {
        fixed (int* p = &x) F(p);
        fixed (int* p = &t.y) F(p); // pointer to a member of a class 
        fixed (int* p = &a[0]) F(p);
        fixed (int* p = a) F(p);
    }
}
}

答案 1 :(得分:2)

要获取指向托管对象的指针,它必须是fixed,以便GC知道不要移动对象。