代码之家  ›  专栏  ›  技术社区  ›  Sky Sanders

帮助将反射器解构翻译成可编译代码

  •  2
  • Sky Sanders  · 技术社区  · 14 年前

    因此,我对一些framework2.0代码进行了反思,并最终进行了以下解构

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

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

    我知道反射器只能是近似的,通常我可以看到一个清晰的路径,但这是有点超出我的经验。

    问:反射镜想向我描述什么?

    更新:

    我也看到了以下情况

    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* 删除了演员阵容,停止了抱怨,因为我从这次谈话的参与者那里收集到 无效* intptr* 相当于我简单地把它们换掉,结果是:

    fixed (void* ptrRef3 = &_someMember)
    

    已修复(void*ptrRef3=&_(成员)
    

    相当于

    2 回复  |  直到 14 年前
        1
  •  2
  •   Mitch Wheat    14 年前

    _someMember 把它扔给 (void *) (即指针地址),然后设置该地址的位置。

    fixed 语句“固定”对象,并防止GC移动它。

    “&”在该上下文中使用的是“Address Of”运算符,而不是按位And。

    针对更新的问题:

    你试过:

    fixed (void* voidRef3 = &_someMember) 
    { 
    ... 
    }
    
        2
  •  0
  •   egrunin    14 年前

    回应你最后的评论:这对你有用吗?

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

    编辑

    我不明白你的意思

    给了我

    当您插入 (IntPtr *) ?

    有人能证实吗

    fixed (void* ptrRef3 = &_someMember)

    fixed (IntPtr* ptrRef3 = &_someMember)

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

    fixed 要禁用该内存的垃圾收集,请让您告诉运行时何时可以安全地取消分配。

    因此,这不是您应该保留的代码:一旦您弄清楚该数据位的真正含义和寿命,就重写它以使用常规(垃圾收集)变量。