当使用 DotPeek 之类的东西来反编译 DLL 时,我如何判断它最初是用 VB.Net 还是 C# 编码的?
我认为没有简单的方法可以分辨,但是在某些反编译的代码中可能存在明显的迹象(即线索)?
当使用 DotPeek 之类的东西来反编译 DLL 时,我如何判断它最初是用 VB.Net 还是 C# 编码的?
我认为没有简单的方法可以分辨,但是在某些反编译的代码中可能存在明显的迹象(即线索)?
您可以查找对该Microsoft.VisualBasic
库的引用。如果存在这种情况,则代码很可能是使用 VB 编写的。该库有时也包含在 C# 项目中,但这并不常见。如果没有参考,那肯定不是 VB。
(嗯,可以使用命令行编译器和特殊的编译器开关在没有库的情况下编译 VB,但这种情况极为罕见。)
您还可以检查该VisualBasic
库的使用频率。在常规的 VB 程序中,它会经常使用,但在 C# 程序中,它通常只用于某些在其他库中不可用的特定任务,例如DateDiff
调用。
任何 VB 特定命令,例如CInt
或Mid
将显示为对VisualBasic
库的调用,甚至=
在字符串上使用的运算符都将使用该库。此代码(其中a
和b
是字符串):
If a = b Then
实际上会进行库调用来进行比较,并在反编译为 C# 时显示如下:
if (Operators.CompareString(a, b, false) == 0) {
一种可能的途径可能是寻找命名索引器;在 C# 中是不允许的,即你只能在 c# 中使用以下内容
object this [int index] {get;set;}
但是在托管的 C++ 和 VB.Net 中(我相信,如果我错了会删除它)看起来你可以命名索引器。
所以至少你可以把它缩小到它是否是 C#
为了完整起见,我将发布我知道的线索:
如果反编译为 C# 并发现以 $static$ 开头的无效成员名称:
private short $STATIC$Report_Print$20211C1280B1$nHeight;
...这意味着它可能是 VB.Net,因为编译器使用它们来实现“静态”VB 关键字。
Hans Passant 和 Jon Skeet 在这里解释得更好:https ://stackoverflow.com/a/7311567/22194 https://stackoverflow.com/a/7310497/22194
我很惊讶My
还没有人提到命名空间。很难让 VB.NET 编译器在输出中不包含它的一些帮助类。
如何判断它最初是用 VB.Net 还是 C# 编码的?
你不能以一种可靠的方式说出来。当然,使用 VB.NET 编译器编译的 IL 将包含对某些 VB 特定程序集(例如Microsoft.VisualBasic
)的引用,但没有什么可以阻止 C# 项目也引用和使用这些程序集。
为了建立在其他答案中引入的想法,程序集不会报告使用什么语言编写它,但您可能会寻找不符合 cls 的代码
符合 CLS 意味着代码是针对所有符合 CLS 的语言都可用的功能编写的。这意味着没有公共的嵌套类或命名的索引器,并且可能还有一些 IL 可能支持但任何特定语言可能不支持的其他特性。
如果是一个选项,您可能只需要查看 PDB。