反编译的DLL - 帮助判断它是C#还是VB.NET的线索?

时间:2013-03-03 10:41:38

标签: c# .net vb.net decompiler

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

我认为没有简单的方法可以告诉你,但是在某些反编译代码中可能会有迹象(即线索)吗?

6 个答案:

答案 0 :(得分: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) {

答案 1 :(得分:3)

一条可行的路线可能是寻找命名索引器; C#中不允许这样做,即你只能在c#

中拥有以下内容
object this [int index] {get;set;}

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

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

答案 2 :(得分:2)

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

如果您反编译为C#并找到以$ static $:

开头的无效成员名称
private short $STATIC$Report_Print$20211C1280B1$nHeight;

...这意味着它可能是VB.Net,因为编译器使用它们来实现'Static'VB关键字。

Hans Passant和Jon Skeet在这里解释得更好:https://stackoverflow.com/a/7311567/22194 https://stackoverflow.com/a/7310497/22194

答案 3 :(得分:2)

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

答案 4 :(得分:1)

  

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

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

答案 5 :(得分:0)

为了建立在其他答案中引入的想法,程序集不会报告用于编写它的语言,但您可能会寻找非cls compliant code

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

如果是一个选项,你可以只看一下PDB。