当使用像DotPeek这样的东西反编译DLL时,如何判断它最初是用VB.Net还是C#编码的?
我认为没有简单的方法可以告诉你,但是在某些反编译代码中可能会有迹象(即线索)吗?
答案 0 :(得分:7)
您可以查找对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) {
答案 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。