反编译 C# 时的“PrivateImplementationDetails”函数
Posted
技术标签:
【中文标题】反编译 C# 时的“PrivateImplementationDetails”函数【英文标题】:"PrivateImplementationDetails" function when decompiling a C # 【发布时间】:2017-11-04 10:40:38 【问题描述】:我正在重建一个用 C# 编程的库,需要 Switch
语句的帮助,我有以下代码 sn-p 使用编译期间生成的 <PrivateImplementationDetails> .ComputeStringHash ()
函数。我的问题是,我应该使用什么功能?使用sss.GetHashCode()
会得到相同的结果吗?
目前显示给我的错误是Can not resolve symbol 'PrivateImplementationDetails'
。
switch (<PrivateImplementationDetails>.ComputeStringHash(sss))
case 0x1315fc:
if (sss == "ASD")
break;
goto Label_0105;
case 0x15c3dc:
if (sss == "JKL")
break;
goto Label_0105;
【问题讨论】:
你的反编译器不够聪明,无法识别这个结构,这有点可以理解,因为这个代码生成是最近才添加的。原始代码只有switch (sss) case "ASD": etc
。生成哈希会加快速度。
@HansPassant 那么,如果我使用sss.GetHashCode()
而不是重新编码开关(开关很长),这会起作用吗?谢谢
没有。您根本不应该使用任何哈希码。当您为字符串编写普通的 switch 语句时,C# 编译器会自动生成它。试试看。
【参考方案1】:
下面的这段代码是正确运行您的代码而不会出现任何错误的代码:
internal sealed class PrivateImplementationDetails
internal static uint ComputeStringHash(string s)
uint num = new uint();
if (s != null)
num = 0x811c9dc5;
for (int i = 0; i < s.Length; i++)
num = (s[i] ^ num) * 0x1000193;
return num;
并删除PrivateImplementationDetails
周围的<>
【讨论】:
但是为什么,当 Hans 已经解释这只是反编译器的误解时,这段代码是否相关?一年后它对 OP 有用的可能性有多大(或者实际上大多数反编译器已经更新以处理这个问题时的任何其他人)? 这也是一个仅代码的答案,几乎没有解释它的作用或工作原理。您至少可以提及它是 FNV-1a algorithm 或指向 C# source code,您无疑会引用它来获取此信息。【参考方案2】:在提出问题时,生成的 IL 相对较新,因此反编译器尚未更新以支持它。本质上,反编译器揭示了一些底层 .NET 框架代码和用于支持字符串 switch 语句的 hash function。
现在,大约一年后,反编译器已经更新,所以它们应该只显示一个 switch
语句,如下所示:
switch (sss)
case "ASD":
// do something
break;
case "JKL":
// do something
break
我已经用DotPeek 对此进行了测试,并且可以确认它正确地显示了这一点。
【讨论】:
以上是关于反编译 C# 时的“PrivateImplementationDetails”函数的主要内容,如果未能解决你的问题,请参考以下文章