帮助将Reflector解构转换为可编译的代码

时间:2010-05-16 07:05:24

标签: c# bit-manipulation unsafe

所以我反思一些框架2.0代码并最终得到以下解构

fixed (void* voidRef3 = ((void*) &_someMember))
{
...
}

由于“The right hand side of a fixed statement assignment may not be a cast expression

,因此无法编译

我知道Reflector只能近似,一般我可以看到一条清晰的路径,但这有点超出了我的经验。

问题:Reflector试图向我描述什么?

更新:

我也看到以下

fixed (IntPtr* ptrRef3 = ((IntPtr*) &this._someMember))

更新

因此,正如Mitch所说,它不是一个按位运算符,而是一个addressOf运算符。

现在问题:

fixed (IntPtr* ptrRef3 = &_someMember)

因“Cannot implicitly convert type 'xxx*' to 'System.IntPtr*'. An explicit conversion exists (are you missing a cast?)”编译错误而失败。

所以如果我这样做,我似乎该被诅咒,如果我不这样做该死的话。有什么想法吗?

更新

我想我已经想到了。我偶然回到使用void*的表达式并移除了演员表并且VS停止了抱怨,因为我从这次谈话的参与者那里收集void*intptr*等同于我将它们换掉,结果如下:

fixed (void* ptrRef3 = &_someMember)

和VS停止抱怨。有人可以验证

fixed (void* ptrRef3 = &_someMember)

相当于

fixed (IntPtr* ptrRef3 = &_someMember)

2 个答案:

答案 0 :(得分:2)

它取_someMember的地址并将其转换为(void *)(即指针地址),然后将位置设置为该地址。

fixed语句'固定'对象,并阻止GC移动它。

'&'在该上下文中使用的是'Address Of'运算符,而不是Bitwise And。

回应更新的问题:

你试过了吗?

fixed (void* voidRef3 = &_someMember) 
{ 
... 
}

答案 1 :(得分:0)

回复你的上一条评论:这对你有用吗?

fixed (IntPtr* ptrRef3 = (IntPtr *) &_someMember)

修改

我不确定你的意思

  

这实际上是什么反射器   给了我

你提到的错误似乎很清楚:如果你问的话,它可以显式地从(void *)转换为(IntPtr *)。我的例子问,你的没有。

插入(IntPtr *)时,您是否真的收到相同的错误消息?

另一个编辑

  

有人可以验证

     

fixed (void* ptrRef3 = &_someMember)

     

相当于

     

fixed (IntPtr* ptrRef3 = &_someMember)

首先:是的,它们是等价的。

其次:我一直在考虑这一切意味着什么。我认为反编译器认为它不足以创建一个对_someMember的可移动引用,因此不能将它留给C#运行时来管理它。为了解决这个问题,它使用fixed来禁用该内存的垃圾收集,让它告诉运行时什么时候可以安全地解除分配。

因此,这不是您应该保留的代码:只要您弄清楚该位数据的真实含义和生命周期,请将其重写为使用常规(垃圾收集)变量。