这可能是一个愚蠢的问题,但我真的很好奇,如果我能做到这一点.我写了以下示例程序:
class Test1 {
public const int b = 8;
public static int z = 3;
public static void Main(string[] args){
const int q = 6;
Console.WriteLine(q);
Console.WriteLine(b);
Console.WriteLine(z);
}
}
Run Code Online (Sandbox Code Playgroud)
Y编译使用mcs然后我用生成的exe组装了生成的exe monodis.获得以下代码:
.field public static literal int32 b = int32(0x00000008)
.field public static int32 z
// method line 2
.method public static hidebysig
default void Main (string[] args) cil managed
{
// Method begins at RVA 0x2058
.entrypoint
// Code size 23 (0x17)
.maxstack 8
IL_0000: ldc.i4.6
IL_0001: call void class [mscorlib]System.Console::WriteLine(int32)
IL_0006: ldc.i4.8
IL_0007: call void class [mscorlib]System.Console::WriteLine(int32)
IL_000c: ldsfld int32 Test.Test1::z
IL_0011: call void class [mscorlib]System.Console::WriteLine(int32)
IL_0016: ret
} // end of method Test1::Main
Run Code Online (Sandbox Code Playgroud)
我想用来ldsfld加载b的值.如果我将IL_0006更改为ldsfld int32 Test.Test1::b,它将汇编,但是当我运行可执行文件时,我获得了一个excpetion:
Unhandled Exception:
System.InvalidProgramException: Invalid IL code in Test.Test1:Main
(string[]): IL_0006: ldsfld 0x04000001
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidProgramException:
Invalid IL code in Test.Test1:Main (string[]): IL_0006: ldsfld 0x04000001
Run Code Online (Sandbox Code Playgroud)
有没有办法使用static literal而不是只使用ldc?
小智 6
您已经从C#透视图中获得了评论作为答案,但CIL规范更合适也更明确:
I.8.6.1.2位置签名
该文本约束的承诺,该位置的值实际上是一个内置式的固定值.该值被指定为约束的一部分.编译器需要用其值替换对该位置的所有引用,因此VES不需要为该位置分配空间.此约束虽然在逻辑上适用于任何位置,但只能放在复合类型的静态字段上.如此标记的字段不允许从CIL引用(它们应在编译时内联到它们的常量值),但可以使用直接处理元数据的反射和工具来使用.
所以,不,没有办法直接引用该字段,并且不应该存在.
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |