Microsoft MVP성태의 닷넷 이야기
닷넷: 2137. ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler [링크 복사], [링크+제목 복사],
조회: 14481
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

ILSpy의 nuget 라이브러리 버전 - ICSharpCode.Decompiler

이번에도 ^^ 트윗으로 본 내용을 소개합니다.


Did you know that ILSpy is providing a nuget package allowing you to list (in 8 lines of code) the string literals compiled in a .NET assembly?
; https://twitter.com/chnasarre/status/1685350012614578176

ILSpy의 nuget 버전으로 ICSharpCode.Decompiler가 있는데요, 이미 우리에게는 Visual Studio에서도 심심치 않게 봤을 정도로 은근 낯설지 않은 라이브러리입니다. ^^

ICSharpCode.Decompiler
; https://www.nuget.org/packages/ICSharpCode.Decompiler

다음은 닷넷 어셈블리의 "#Strings" 영역을 뒤져 문자열 리터럴을 출력하는 소스 코드로,

using ICSharpCode.Decompiler.Metadata;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;

namespace ConsoleApp1;

// Install-Package ICSharpCode.Decompiler
internal class Program
{
    static void Main(string[] args)
    {
        string dllPath = typeof(Program).Assembly.Location;

        using (var peFile = new PEFile(dllPath))
        {
            MetadataReader metadata = peFile.Metadata;
            UserStringHandle handle = MetadataTokens.UserStringHandle(0);

            do
            {
                string literal = metadata.GetUserString(handle);
                Console.WriteLine($"'{literal}'");
                handle = metadata.GetNextHandle(handle);
            } while (!handle.IsNil);
        }
    }
}

얼핏 ^^ ICSharpCode.Decompiler가 제공하는 듯하지만 (덧글에 "@Lucas Trzesniewski"가 지적한 것처럼) 실제로는 System.Reflection.Metadata로 연결시켜 접근하고 있습니다.

그래서 위의 소스 코드를 ICSharpCode 참조 없이 순수하게 System.Reflection.Metadata만을 이용해 다음과 같이 만들 수 있습니다.

using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;

namespace ConsoleApp1;

internal class Program
{
    static void Main(string[] args)
    {
        string dllPath = typeof(Program).Assembly.Location;

        FileStream stream = File.OpenRead(dllPath);
        PEReader peReader = new PEReader(stream);

        MetadataReader metadata = peReader.GetMetadataReader();
        UserStringHandle handle = MetadataTokens.UserStringHandle(0);

        do
        {
            string literal = metadata.GetUserString(handle);
            Console.WriteLine($"'{literal}'");
            handle = metadata.GetNextHandle(handle);
        } while (!handle.IsNil);
    }
}

오호~~~ 저도 PortableExecutable에 대한 PEReader 타입이 있는지 오늘 처음 알았습니다. ^^

그나저나, 제목과는 달리 (ICSharpCode.Decompiler가 아닌) System.Reflection.Metadata에 대한 소개가 되었군요. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 8/20/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 91  92  93  94  95  96  [97]  98  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11573정성태7/2/201819769Math: 26. GeoGebra 기하 (3) - 평행선
11572정성태7/1/201818799.NET Framework: 783. C# 컴파일러가 허용하지 않는 (유효한) 코드를 컴파일해 테스트하는 방법
11571정성태7/1/201820411.NET Framework: 782. C# - JIRA에 등록된 Project의 Version 항목 추가하는 방법파일 다운로드1
11570정성태7/1/201821772Math: 25. GeoGebra 기하 (2) - 임의의 선분과 특정 점을 지나는 수직선파일 다운로드1
11569정성태7/1/201819835Math: 24. GeoGebra 기하 (1) - 수직 이등분선파일 다운로드1
11568정성태7/1/201832131Math: 23. GeoGebra 기하 - 컴퍼스와 자를 이용한 작도 프로그램 [1]
11567정성태6/28/201822272.NET Framework: 781. C# - OpenCvSharp 사용 시 포인터를 이용한 속도 향상파일 다운로드1
11566정성태6/28/201827685.NET Framework: 780. C# - JIRA REST API 사용 정리 (1) Basic 인증 [4]파일 다운로드1
11565정성태6/28/201825421.NET Framework: 779. C# 7.3에서 enum을 boxing 없이 int로 변환하기 - 세 번째 이야기파일 다운로드1
11564정성태6/27/201824005.NET Framework: 778. (Unity가 사용하는) 모노 런타임의 __makeref 오류
11563정성태6/27/201821037개발 환경 구성: 386. .NET Framework Native compiler 프리뷰 버전 사용법 [2]
11562정성태6/26/201820543개발 환경 구성: 385. 레지스트리에 등록된 원격지 스크립트 COM 객체 실행 방법
11561정성태6/26/201833136.NET Framework: 777. UI 요소의 접근은 반드시 그 UI를 만든 스레드에서! [8]파일 다운로드1
11560정성태6/25/201824689.NET Framework: 776. C# 7.3 - 초기화 식에서 변수 사용 가능(expression variables in initializers)파일 다운로드1
11559정성태6/25/201832151개발 환경 구성: 384. 영문 설정의 Windows 10 명령행 창(cmd.exe)의 한글 지원 [6]
11558정성태6/24/201825699.NET Framework: 775. C# 7.3 - unmanaged(blittable) 제네릭 제약파일 다운로드1
11557정성태6/22/201823755.NET Framework: 774. C# - blittable 타입이란?파일 다운로드1
11556정성태6/19/201831484.NET Framework: 773. C# 7.3 - 구조체의 고정 크기를 갖는 fixed 배열 필드에 대한 직접 접근 가능 [1]파일 다운로드1
11555정성태6/18/201823486.NET Framework: 772. C# 7.3 - 사용자 정의 타입에 fixed 적용 가능(Custom fixed)파일 다운로드1
11554정성태6/17/201825106.NET Framework: 771. C# 7.3 - 자동 구현 속성에 특성 적용 가능(Attribute on backing field)
11553정성태6/15/201824108.NET Framework: 770. C# 7.3 - 개선된 메서드 선택 규칙 3가지(Improved overload candidates)파일 다운로드1
11552정성태6/15/201827095.NET Framework: 769. C# 7.3에서 개선된 문법 4개(Support == and != for tuples, Ref Reassignment, Constraints, Stackalloc initializers)파일 다운로드1
11551정성태6/14/201822883개발 환경 구성: 383. BenchmarkDotNet 사용 시 주의 사항
11550정성태6/13/201822238.NET Framework: 768. BenchmarkDotNet으로 Span<T> 성능 측정 [2]
11549정성태6/13/201825356개발 환경 구성: 382. BenchmarkDotNet에서 생성한 BuildPlots.R 파일을 실행하는 방법
11548정성태6/13/201821449오류 유형: 470. .NET Core + BenchmarkDotNet 실행 시 프레임워크를 찾지 못하는 문제
... 91  92  93  94  95  96  [97]  98  99  100  101  102  103  104  105  ...