4

当使用 DotPeek 之类的东西来反编译 DLL 时,我如何判断它最初是用 VB.Net 还是 C# 编码的?

我认为没有简单的方法可以分辨,但是在某些反编译的代码中可能存在明显的迹象(即线索)?

4

6 回答 6

7

您可以查找对该Microsoft.VisualBasic库的引用。如果存在这种情况,则代码很可能是使用 VB 编写的。该库有时也包含在 C# 项目中,但这并不常见。如果没有参考,那肯定不是 VB。

(嗯,可以使用命令行编译器和特殊的编译器开关在没有库的情况下编译 VB,但这种情况极为罕见。)

您还可以检查该VisualBasic库的使用频率。在常规的 VB 程序中,它会经常使用,但在 C# 程序中,它通常只用于某些在其他库中不可用的特定任务,例如DateDiff调用。

任何 VB 特定命令,例如CIntMid将显示为对VisualBasic库的调用,甚至=在字符串上使用的运算符都将使用该库。此代码(其中ab是字符串):

If a = b Then

实际上会进行库调用来进行比较,并在反编译为 C# 时显示如下:

if (Operators.CompareString(a, b, false) == 0) {
于 2013-03-03T10:59:04.757 回答
3

一种可能的途径可能是寻找命名索引器;在 C# 中是不允许的,即你只能在 c# 中使用以下内容

object this [int index] {get;set;}

但是在托管的 C++ 和 VB.Net 中(我相信,如果我错了会删除它)看起来你可以命名索引器。

所以至少你可以把它缩小到它是否是 C#

于 2013-03-03T10:48:16.277 回答
2

为了完整起见,我将发布我知道的线索:

如果反编译为 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

于 2013-03-03T10:52:10.300 回答
2

我很惊讶My还没有人提到命名空间。很难让 VB.NET 编译器在输出中不包含它的一些帮助类。

于 2013-03-05T15:10:07.877 回答
1

如何判断它最初是用 VB.Net 还是 C# 编码的?

你不能以一种可靠的方式说出来。当然,使用 VB.NET 编译器编译的 IL 将包含对某些 VB 特定程序集(例如Microsoft.VisualBasic)的引用,但没有什么可以阻止 C# 项目也引用和使用这些程序集。

于 2013-03-03T10:42:40.097 回答
0

为了建立在其他答案中引入的想法,程序集不会报告使用什么语言编写它,但您可能会寻找不符合 cls 的代码

符合 CLS 意味着代码是针对所有符合 CLS 的语言都可用的功能编写的。这意味着没有公共的嵌套类或命名的索引器,并且可能还有一些 IL 可能支持但任何特定语言可能不支持的其他特性。

如果是一个选项,您可能只需要查看 PDB。

于 2013-03-03T10:57:25.200 回答