当使用类似DotPeek这样的工具反编译DLL时,我如何知道它最初是用VB.Net还是C#编写的?
我了解到没有简单的方法可以确定,但在一些反编译代码中可能会有一些提示性的迹象(即线索)?
当使用类似DotPeek这样的工具反编译DLL时,我如何知道它最初是用VB.Net还是C#编写的?
我了解到没有简单的方法可以确定,但在一些反编译代码中可能会有一些提示性的迹象(即线索)?
Microsoft.VisualBasic
库的引用。如果有此引用,则该代码很可能是使用VB制作的。此库有时也包括在C#项目中,但这不是非常普遍的。如果没有此引用,则肯定不是VB。VisualBasic
库的使用频率。在常规的VB程序中,它会经常被使用,但在C#程序中,通常只会用于某些其他库中没有的特定任务,例如 DateDiff
调用。CInt
或Mid
将显示为对VisualBasic
库的调用,甚至在对字符串使用=
运算符时也会使用该库。下面的代码(其中a和b是字符串):If a = b Then
实际上,将会进行一次库调用来进行比较,反编译为C#后的代码如下:
if (Operators.CompareString(a, b, false) == 0) {
一种可能的方法是寻找命名索引器; 在C#中不允许,即您只能在C#中拥有以下内容
object this [int index] {get;set;}
但是在托管的C++和VB.Net中(我相信,如果我错了,将删除此内容),似乎可以拥有命名索引器。
因此,至少你可以缩小范围,看它是否是C#。
我很惊讶没有人提到My
命名空间。很难让VB.NET编译器不在输出中包含一些辅助类。
为了完整起见,我将发布我所知道的提示:
如果您反编译到C#并找到以$static$开头的无效成员名称:
private short $STATIC$Report_Print$20211C1280B1$nHeight;
...这意味着它很可能是VB.Net,因为编译器使用它们来实现“Static”VB关键字。
Hans Passant和Jon Skeet在这里解释得更好:https://dev59.com/TFrUa4cB1Zd3GeqPo_iT#7311567 https://dev59.com/TFrUa4cB1Zd3GeqPo_iT#7310497
我该如何判断一个程序最初是使用VB.Net还是C#编写的?
你无法可靠地确定。当然,使用VB.NET编译器编译的IL代码将包含对某些VB特定程序集(例如Microsoft.VisualBasic
)的引用,但这并不妨碍C#项目也引用并使用这些程序集。
Microsoft.VisualBasic
程序集。我再重复一遍 - 没有任何阻止C#项目引用和使用此程序集,因为它包含一些有用的方法。 - Darin Dimitrov为了进一步发挥其他答案中提出的思路,汇编不会报告用于编写它的语言,但您可以寻找非CLS兼容代码。
符合CLS意味着该代码针对所有CLS兼容语言可用的功能进行编写。这意味着没有公共嵌套类或命名索引器,可能还有许多其他IL支持但任何特定语言可能不支持的功能。
如果可以的话,您可能只需查看PDB文件。