2014-11-11 3 views
0

특정 네임 스페이스의 모든 클래스에 속성 (난독 화 관련)을 적용해야합니다. 나는 현재 목록을 통해 일하고 있으며 손으로하고 있지만 자동으로 적용되는 방식으로 해보기를 원합니다. 이렇게하면 나에게 약간의 작업을 절약 할 수있을뿐만 아니라 미래에이 네임 스페이스에 추가 된 클래스도 특성을 갖게됩니다.네임 스페이스의 모든 구성원에게 특성을 적용 할 수 있습니까?

C#에는이 줄에 대한 규정이 있습니까?

+0

네임 스페이스에 특성을 적용 할 수 없습니다. 특성을 대상으로 받아 들여야하지만 어셈블리 전체에 적용 할 수 있으며 난독 화 라이브러리는 해석 방법을 알아야합니다. 지원하지 않으면 배치 스크립트를 작성하여 프로젝트의 .cs 파일을 수정할 수도 있습니다. –

+3

@DJKRAZE, 무엇이 목록 입니다 .Contains() 메소드는 atteributes와 관련이 있습니까? – Rahul

+0

잘못된 링크를 게시하여 죄송합니다. [Attributes Tutorial] (http://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx) – MethodMan

답변

1

.Net에서 내장 기능을 인식하지 못합니다. 그러나 Mono.Cecil을 사용하면 쉽게 지정할 수 있습니다. 지정된 유형에 지정된 속성을 주입 할 수있는 방법입니다. 여기

private static void InjectAttribute<T>(string source,string destination,string nameSpace="")where T:Attribute 
    { 
     var assembly = AssemblyDefinition.ReadAssembly(source); 
     var module = assembly.MainModule; 
     var types = module.GetTypes(); 


     var attributeConstructor = module.Import(typeof (T).GetConstructor(Type.EmptyTypes)); 

     foreach (var type in types) 
     { 
      if (type.FullName.StartsWith(nameSpace)) 
       type.CustomAttributes.Add(new CustomAttribute(attributeConstructor)); 
     } 

     assembly.Write(destination); 
    } 

은 샘플 인젝터 프로그램입니다 : (참고 : 세실의 형태를 해결 할 필요가 없습니다 그래서 난 내 인젝터 프로그램에서 당황 라이브러리를 참조) :

private static void Main(string[] args) 
    { 
     //NOTE:obfuscatelib is already referenced to injector so no need to resolve types 
     InjectAttribute<ObfuscationLib.ObfuscateAttribute>(@"assembly path", 
      @"injected assembly path","namespace (based on full name)"); 
    } 

당신에게이 Mono.Cecil을 PM> Install-Package Mono.Cecil Nuget 명령을 통해 얻을 수 있습니다.

+1

멋진 walkthrough 솔루션입니다. – Disposer

관련 문제