gpt4 book ai didi

c# - 相同的 IL 代码,不同的输出——这怎么可能?

转载 作者:太空狗 更新时间:2023-10-29 17:54:19 62 4
gpt4 key购买 nike

我有一段代码,输出不同的结果,具体取决于 C# 编译器和运行时。

有问题的代码是:

using System;

public class Program {
public static void Main() {
Console.WriteLine(string.Compare("alo\0alo\0", "alo\0alo\0\0", false, System.Globalization.CultureInfo.InvariantCulture));
}
}

结果是:

                    Compiling with mono (gmcs)    Compiling with .Net (csc)
Running with mono -1 -1
Running with .Net -1 0

如何在.Net框架下运行时输出不同的值?

(顺便说一句,根据 http://msdn.microsoft.com/en-us/library/system.string.aspx 输出应该是 0,所以 mono 的答案不正确,但这与我的问题无关。)

甚至生成的 IL 代码也(几乎)相同。

用 .Net 编译:

.method public hidebysig static void  Main() cil managed
{
.entrypoint
// Code size 29 (0x1d)
.maxstack 8
IL_0000: nop
IL_0001: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 ) // a.l.o...a.l.o...
IL_0006: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 // a.l.o...a.l.o...
00 00 )
IL_000b: ldc.i4.0
IL_000c: call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_InvariantCulture()
IL_0011: call int32 [mscorlib]System.String::Compare(string,
string,
bool,
class [mscorlib]System.Globalization.CultureInfo)
IL_0016: call void [mscorlib]System.Console::WriteLine(int32)
IL_001b: nop
IL_001c: ret
} // end of method Program::Main

用单声道编译:

.method public hidebysig static void  Main() cil managed
{
.entrypoint
// Code size 27 (0x1b)
.maxstack 8
IL_0000: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 ) // a.l.o...a.l.o...
IL_0005: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 // a.l.o...a.l.o...
00 00 )
IL_000a: ldc.i4.0
IL_000b: call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_InvariantCulture()
IL_0010: call int32 [mscorlib]System.String::Compare(string,
string,
bool,
class [mscorlib]System.Globalization.CultureInfo)
IL_0015: call void [mscorlib]System.Console::WriteLine(int32)
IL_001a: ret
} // end of method Program::Main

唯一的区别是 .Net 版本中的两个额外的 NOP 指令。

这怎么可能?两个输出值怎么会不一样呢?

另外,如果有人同时安装了 .Net 和 mono,你能重现吗?

编辑:我不关心正确的结果是什么,我不关心mono 和.Net 产生不同的结果。我可能永远不会遇到嵌入的空值并对它们进行排序并且排序顺序很重要。

我的问题是,当由不同的编译器编译时,相同的运行时 (.Net 2.0) 会产生不同的结果。

编辑 2:我添加了一个表格并试图澄清问题,现在应该更容易理解了。

最佳答案

我的猜测是,当您使用 Mono 编译它时,它引用 .NET 2.0 版本的 mscorlib - 而当您使用 VS 编译它时,它以 .NET 4.0 为目标。

对于每种情况下针对的确切版本,我可能是不正确的,但这就是我希望开始的地方:不要查看方法的 IL,查看引用的程序集。

(顺便说一下,如果您能说出您安装了哪些版本的 VS、.NET 和 Mono,这可能会有所帮助。)

编辑:好的,那么如果无论您的目标版本是什么,它都做同样的事情,那么对在每个版本上运行 ildasm 的结果运行差异怎么样?比较整个文件,而不仅仅是方法调用本身的 IL。

关于c# - 相同的 IL 代码,不同的输出——这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806930/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com