反编译的DLL——有哪些线索可以帮助判断它是用C#还是VB.NET编写的?

4

当使用类似DotPeek这样的工具反编译DLL时,我如何知道它最初是用VB.Net还是C#编写的?

我了解到没有简单的方法可以确定,但在一些反编译代码中可能会有一些提示性的迹象(即线索)?

6个回答

7
您可以查找对 Microsoft.VisualBasic 库的引用。如果有此引用,则该代码很可能是使用VB制作的。此库有时也包括在C#项目中,但这不是非常普遍的。如果没有此引用,则肯定不是VB。
(嗯,也有可能使用命令行编译器和特殊编译器开关编译VB而无需库,但这种情况极为罕见。)
您还可以检查 VisualBasic 库的使用频率。在常规的VB程序中,它会经常被使用,但在C#程序中,通常只会用于某些其他库中没有的特定任务,例如 DateDiff 调用。
任何VB特定的命令,如CIntMid将显示为对VisualBasic库的调用,甚至在对字符串使用=运算符时也会使用该库。下面的代码(其中a和b是字符串):
If a = b Then

实际上,将会进行一次库调用来进行比较,反编译为C#后的代码如下:

if (Operators.CompareString(a, b, false) == 0) {

啊,这是个好答案,谢谢。就像你所说的,有时人们从C#参考这个汇编,但他们通常只使用其中的特定部分。 - codeulike
2
如果没有提到引用,那几乎肯定不是VB。如果你只是在决定使用VB还是C#,那就是一个非常强的线索。 - codeulike

3

一种可能的方法是寻找命名索引器; 在C#中不允许,即您只能在C#中拥有以下内容

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

但是在托管的C++和VB.Net中(我相信,如果我错了,将删除此内容),似乎可以拥有命名索引器。

因此,至少你可以缩小范围,看它是否是C#。


但是如果原始代码没有使用命名索引器的这个罕见特性怎么办?我说罕见是因为,嗯,C#不支持它。 - Darin Dimitrov
好吧,它可能不起作用,但至少它是一种具体的语言限制。也许还有更晦涩的限制?我不知道。 - Meirion Hughes
@David 谢谢,这正是我正在寻找的线索。我怀疑还有许多其他类似的细节可能是线索。 - codeulike

2

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


2

1

我该如何判断一个程序最初是使用VB.Net还是C#编写的?

你无法可靠地确定。当然,使用VB.NET编译器编译的IL代码将包含对某些VB特定程序集(例如Microsoft.VisualBasic)的引用,但这并不妨碍C#项目也引用并使用这些程序集。


我相信可能有方法,例如参见https://dev59.com/TFrUa4cB1Zd3GeqPo_iT - codeulike
这些是编译器的实现细节,你不应该依赖它们,因为它们可能会在未来的编译器版本中发生变化。 - Darin Dimitrov
我很乐意接受基于实现细节的答案,因为这些细节可能会发生变化。我寻找线索,而不是一种永远有效的确定方法。 - codeulike
哦,你所提到的这些 VB 特定程序集是什么?那听起来像是一个不错的线索。 - codeulike
1
@codeulike,这是Microsoft.VisualBasic程序集。我再重复一遍 - 没有任何阻止C#项目引用和使用此程序集,因为它包含一些有用的方法。 - Darin Dimitrov
没错,但是如果有人从 C# 中使用它,他们可能会以特定的方式使用它。在这里可以看到 Guffa 给出的好答案:https://dev59.com/um_Xa4cB1Zd3GeqPxyaC#15184955 - codeulike

0

为了进一步发挥其他答案中提出的思路,汇编不会报告用于编写它的语言,但您可以寻找非CLS兼容代码

符合CLS意味着该代码针对所有CLS兼容语言可用的功能进行编写。这意味着没有公共嵌套类或命名索引器,可能还有许多其他IL支持但任何特定语言可能不支持的功能。

如果可以的话,您可能只需查看PDB文件。


这听起来很有前途,但是VB.Net和C#之间是否存在一些差异会在这里显示出来呢?例如,它们都使用公共嵌套类吗? - codeulike
2
这是正确的,它们都是如此。由于IL旨在成为语言无关的,因此留给读者去寻找一个语言支持而另一个不支持的所有功能,这是一项练习。归根结底,您无法确定程序集是否具有任何语言,并且纯粹是在ILAsm中创建的。 - Phillip Scott Givens
2
到了一天的尽头,你无法确定汇编语言是否存在,以及它是否纯粹由ILAsm创建。这是一个非常好的观点!我认为这永远不可能是确定性的。 - codeulike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接