Reflector.FileDisassembler 를 사용 하여 DLL 역 컴 파일 하기

본문 출처:http://www.cnblogs.com/wuliangbo/archive/2009/02/04/FileDisassembler.html
Reflector for.NET 다운로드 주소:http://www.aisto.com/roeder/dotnet/
Reflector.FileDisassembler.dll cs 파일 의 도구 다운로드 주소:http://www.denisbauer.com/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 파일 로 컴 파일 하면 버그 가 있 습 니 다.변수,클래스,이름 공간 이 바 뀔 때 가 있 습 니 다.
다행히 FileDisassembler 가 발표 할 때 소스 코드 를 가지 고 있어 서 Reflect 를 생략 할 수 있 습 니 다.기계 가 생 성 한 임시 변수 이름 이 불쾌 해 보이 기 때 문 입 니 다.이 bug 를 복구 하 는 것 은 간단 합 니 다.Create File 방법 을 수정 하 는 동시에 GetUniqueFileName 방법 을 추 가 했 습 니 다.소스 코드 는 다음 과 같 습 니 다.
private StreamWriter CreateFile(string directory, string fileName)  
{  
    directory = directory.Replace("", "_");  
    directory = directory.Replace(":", "_");  
    directory = directory.Replace("|", "_");  
    directory = directory.Replace("?", "_");  
    directory = directory.Replace("*", "_");  
    directory = Path.Combine(this.outputDirectory, directory);  
  
    ILanguage language = this.LanguageManager.ActiveLanguage;  
    string fileExtension = language.FileExtension;  
  
    fileName = fileName.Replace("", "_");  
    fileName = fileName.Replace(":", "_");  
    fileName = fileName.Replace("|", "_");  
    fileName = fileName.Replace("?", "_");  
    fileName = fileName.Replace("*", "_");  
    fileName = Path.Combine(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);  
    }  
  
    StreamWriter writer = new StreamWriter(fileName);  
    return writer;  
}  
  
private Hashtable fileNames = new Hashtable();  
  
private string GetUniqueFileName(string fileName)  
{  
    string strExtension = Path.GetExtension(fileName);  
    fileName = fileName.Replace(strExtension, "");  
  
    string _fileName = fileName.ToLower();  
    bool bFirstRename = true;  
    while(fileNames.Contains(_fileName))  
    {  
        string existFileName = (string)fileNames[_fileName];  
        string [] efnParts = existFileName.Split(new char[] { '""' });  
        string [] fnParts = fileName.Split(new char[] { '""' });  
        for (int i = 0; i < fnParts.Length; ++i)  
        {  
            if (efnParts[i] != fnParts[i])  
            {  
                if (bFirstRename)  
                {  
                    fnParts[i] += '_';  
                    bFirstRename = false;  
                }  
                fnParts[i] += 'x';  
                break;  
            }  
        }  
        fileName = string.Empty;  
        for (int i = 0; i < fnParts.Length; ++i)  
        {  
            fileName += '""' + fnParts[i];  
        }  
        fileName = fileName.Substring(1);  
        _fileName = fileName.ToLower();  
    }  
    fileNames[_fileName] = fileName;  
    return fileName + strExtension;  
} 

좋은 웹페이지 즐겨찾기