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

本文关键字:还是 VB NET 线索 判断 DLL 编译 帮助 | 更新日期: 2023-09-27 18:01:51

当使用像DotPeek这样的东西来反编译DLL时,我如何判断它最初是否在VB中编码。Net还是c# ?

我想没有简单的方法来判断,但可能会有一些迹象(例如。线索)在一些反编译的代码?

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

您可以查找对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) {

一种可能的方法是查找Named Indexers;这在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是非常困难的。

我如何判断它是否最初是用VB编写的。Net还是c# ?

你不能以可靠的方式判断。当然是用VB编译的。. NET编译器将包括对一些VB特定程序集(如Microsoft.VisualBasic)的引用,但没有什么可以阻止c#项目也引用和使用这些程序集。

要建立在其他答案中介绍的思想之上,程序集不报告使用什么语言编写它,但是您可以查找非cls兼容的代码

CLS兼容意味着代码是根据所有CLS兼容语言可用的特性编写的。这意味着没有公共嵌套类或命名索引器,并且可能有许多IL可能支持但任何特定语言可能不支持的其他特性。

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