Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 帮助将反射器解构转换为可编译代码_C#_Bit Manipulation_Unsafe - Fatal编程技术网

C# 帮助将反射器解构转换为可编译代码

C# 帮助将反射器解构转换为可编译代码,c#,bit-manipulation,unsafe,C#,Bit Manipulation,Unsafe,因此,我正在反思一些Framework2.0代码,并以以下解构结束 fixed (void* voidRef3 = ((void*) &_someMember)) { ... } 由于“固定语句赋值的右侧可能不是强制转换表达式”,因此无法编译该语句 我知道反射器只能是近似的,通常我能看到一条清晰的路径,但这有点超出我的经验 问题:Reflector想向我描述什么 更新: 我也看到了以下情况 fixed (IntPtr* ptrRef3 = ((IntPtr*) &this._s

因此,我正在反思一些Framework2.0代码,并以以下解构结束

fixed (void* voidRef3 = ((void*) &_someMember))
{
...
}
由于“
固定语句赋值的右侧可能不是强制转换表达式”,因此无法编译该语句

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

问题:Reflector想向我描述什么

更新:

我也看到了以下情况

fixed (IntPtr* ptrRef3 = ((IntPtr*) &this._someMember))
更新:

因此,正如米奇所说,它不是一个位运算符,而是一个addressOf运算符

问题是:

fixed (IntPtr* ptrRef3 = &_someMember)
由于“
无法将类型“xxx*”隐式转换为“System.IntPtr*”而失败。存在显式转换(是否缺少转换?
'编译错误

因此,我似乎是该死的,如果我这样做,如果我不。有什么想法吗

更新:

我想我已经猜到了。偶然的机会,我回到了使用
void*
的表达式,删除了类型转换,VS停止了抱怨,因为我从本次对话的参与者那里收集到
void*
intptr*
是等效的,我只是将它们换掉,结果是:

fixed (void* ptrRef3 = &_someMember)
并且停止抱怨。有人能证实吗

fixed (void* ptrRef3 = &_someMember)
相当于

fixed (IntPtr* ptrRef3 = &_someMember)

它是将
\u某个成员的地址
转换为
(void*)
(即指针地址),然后将位置设置为该地址

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

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

回应最新问题:

您是否尝试过:

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

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

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

我不知道你的意思

事实上,这就是反射器 给我

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

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

另一次编辑

有人能证实吗

fixed(void*ptrRef3=&u someMember)

相当于

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

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

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


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

Mitch,我更感兴趣的是在我看来是一个位运算符“&”,它修饰了某个成员。显然这是我不熟悉的语法。这似乎是一种援助,而不是一种比较。再说一次,也许我遗漏了什么,用这种方式使用的不是位运算符;这是我同样怀疑的“address of”操作符(与C和C++中的相同)。所以让我调整一下问题。感谢并抱歉移动目标。好的,+1和一张支票,用于回答我的书面问题。我想我真正想要的是一个关于如何以可编译形式表达相同内容的提示。你能帮我一下吗?谢谢你的回复,但这实际上是reflector给我的,它给出了我列出的编译错误。除非
IntPtr
*
之间的空白显著?所以很明显,我不知道如何用编译器喜欢的方式来表达cast。我认为rub.Reflector()是一个从IL生成代码的.net反编译工具。通常,它输出可编译的代码,但在某些边缘情况下,它没有足够的智能从IL构造适当的C。在这些情况下,我通常能够推断出意图。显然,这似乎是一个我不知道如何用C#正确表达的问题。是的,您给出的示例实际上与我问题中给出相同编译错误的第二个代码段相同。这是一个给定的“意图”可以用C表示,因为原始源代码是C,但反编译工具在这个示例中对我没有任何帮助。我不是C#guru,但我和你一样,几十年来一直在推动比特币,当我被sytax难倒时,我感到很恼火我似乎已经找到了解决办法。你介意看一下吗?