转自/wuliangbo
Reflector for .NET 下载地址:/roeder/dotnet/
Reflector.FileDisassembler.dll cs文件的工具下载地址 : /Downloads/Reflector.FileDisassembler.zip
1.下载Reflector.FileDisassembler.zip,解压后得到一些文件,其中Reflector.FileDisassembler.dll是已经编译好的,其它是它源码;
2.打开Reflector,在view菜单下的Add-Ins,将Reflector.FileDisassembler.dll添加到里面;
3.open一个dll,exe,或mcl为后缀的文件,当然要支持.net的
4.选择要反编译的dll(会在列表中显示),选择Tools->File Disassembler,在右窗口会出现设置存放源码位置的路径,点击产生就可以了!
但是使用FileDisassembler编译成CS文件会有一个Bug, 就是变量、类和名称空间有时会重命名。
幸好FileDisassembler发布的时候带有源代码,也就省得去Reflect一把了,毕竟机器生成的临时变量名看起来还是很不爽的。修复这个bug很简单,修改了一下CreateFile方法,同时添加了一个GetUniqueFileName方法,源代码如下:
privateStreamWriterCreateFile(stringdirectory,stringfileName)
{
directory=directory.Replace("<","_");
directory=directory.Replace(">","_");
directory=directory.Replace(":","_");
directory=directory.Replace("|","_");
directory=directory.Replace("?","_");
directory=directory.Replace("*","_");
directory=bine(this.outputDirectory,directory);
ILanguagelanguage=this.LanguageManager.ActiveLanguage;
stringfileExtension=language.FileExtension;
fileName=fileName.Replace("<","_");
fileName=fileName.Replace(">","_");
fileName=fileName.Replace(":","_");
fileName=fileName.Replace("|","_");
fileName=fileName.Replace("?","_");
fileName=fileName.Replace("*","_");
fileName=bine(directory,fileName);
fileName=Path.ChangeExtension(fileName,fileExtension);
fileName=GetUniqueFileName(fileName);
this.WriteLine(fileName);
directory=fileName.Substring(0,fileName.LastIndexOf('""'));
if(!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
StreamWriterwriter=newStreamWriter(fileName);
returnwriter;
}
privateHashtablefileNames=newHashtable();
privatestringGetUniqueFileName(stringfileName)
{
stringstrExtension=Path.GetExtension(fileName);
fileName=fileName.Replace(strExtension,"");
string_fileName=fileName.ToLower();
boolbFirstRename=true;
while(fileNames.Contains(_fileName))
{
stringexistFileName=(string)fileNames[_fileName];
string[]efnParts=existFileName.Split(newchar[]{'""'});
string[]fnParts=fileName.Split(newchar[]{'""'});
for(inti=0;i<fnParts.Length;++i)
{
if(efnParts[i]!=fnParts[i])
{
if(bFirstRename)
{
fnParts[i]+='_';
bFirstRename=false;
}
fnParts[i]+='x';
break;
}
}
fileName=string.Empty;
for(inti=0;i<fnParts.Length;++i)
{
fileName+='""'+fnParts[i];
}
fileName=fileName.Substring(1);
_fileName=fileName.ToLower();
}
fileNames[_fileName]=fileName;
returnfileName+strExtension;
}