反编译的DLL -帮助判断它是c#还是VB.NET的线索
本文关键字:还是 VB NET 线索 判断 DLL 编译 帮助 | 更新日期: 2023-09-27 18:01:51
当使用像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) {
一种可能的方法是查找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。