2012-05-09 4 views
0

내 VSPackage에서 코드의 속성에 대한 참조를 실제 값으로 대체해야합니다. , 즉 클래스의 자원을 찾아 정적 속성하여 HelloWorld의 가치를 - 예를 들어프로젝트 코드 메타 데이터에 액세스하는 방법은 무엇입니까?

public static void Main(string[] args) { 
    Console.WriteLine(Resource.HelloWorld); 
} 

내가 원하는 실제 값 "Resource.HelloWorld"를 대체하는 것입니다. Visual Studio에서 프로젝트의 코드 모델을 처리하기위한 API를 노출합니까? 변수 이름 바꾸기의 일반적인 작업과 매우 유사하기 때문에 하나가 있습니다. 나는 출력 어셈블리에 리플렉션을 사용하고 싶지 않다. 왜냐하면 느리기 때문에 잠시 동안 파일을 잠그기 때문이다.

답변

3

내가 아는 바로는이 방법을 사용할 수 없습니다. AST를 Visual Studio에서 안정적으로 가져오고 변경하는 것은 항상 큰 문제였습니다. Rosalyn 프로젝트의 목표 중 일부는이를 수행하는 통일 된 방법을 만드는 것입니다. 왜냐하면 많은 도구 창에 이러한 종류의 작업을 수행하는 고유 한 방식이 있었기 때문입니다.

네이 작업을 수행하는 방법이 있습니다 :

기호 CodeDOM을

  • 로잘린 AST
  • 비경 방법

    1. 기호
    2. FileCodeModel +

      CodeView와 같은 대부분의 도구 창과 코드 요소 검색과 같은 것들은 컴파일 된 빌드에서 생성 된 기호를 사용합니다. 좀 더 무거운 무게와 동기화 유지하기가 어렵 기 때문에 이것은 이상적이지 않습니다. 이 작업을 느리게하기 위해 기호를 캐시해야합니다. 리플렉터를 사용하면 CodeView가이를 어떻게 구현하는지 볼 수 있습니다.

      이 방법은 전용 어셈블리를 사용합니다. 이 같은 것을 보일 것이다 기호를 가져 오는 코드 :

      var compilerHost = new IDECompilerHost(); 
      
      var typeEnumerator = (from compiler in compilerHost.Compilers.Cast<IDECompiler>() 
                    from type in compiler.GetCompilation().MainAssembly.Types 
                    select new Tuple<IDECompiler, CSharpType>(compiler, type)); 
      
      foreach (var typeTuple in typeEnumerator) 
      { 
          Trace.WriteLine(typeTuple.Item2.Name); 
          var csType = typeTuple.Item2; 
          foreach (var loc in csType.SourceLocations) 
          { 
           var file = loc.FileName.Value; 
           var line = loc.Position.Line; 
           var charPos = loc.Position.Character; 
          } 
      } 
      

      FileCodeModel + CodeDOM을

      당신은 코드 문서와 관련된 FileCodeModel를 얻기 위해 EnvDTE 서비스를 사용하여 시도 할 수 있습니다. 이렇게하면 클래스와 메소드를 얻을 수 있습니다. 그러나 메서드 본문을 가져 오는 것을 지원하지 않습니다. 당신은 버그가있는 COM을 망치고 있습니다. CodeFunction 또는 CodeClass에 대한 COM 객체 참조는 모르는 사이에 무효화 될 수 있기 때문에 추한 것입니다. 이는 자신 만의 미러를 유지해야한다는 의미입니다.

      Rosalyn AST

      이 허용 FileCodeModel 및 기호 모두 같은 기능을 제공합니다

      . 나는 이것으로 놀았고 실제로 그렇게 나쁘지는 않다.

      비경 방법은

      당신은 코드 문서와 관련된 기본 LanguageServiceProvider을 받고 시도 할 수 있습니다. 그러나 이것은 정말로 어렵 기 때문에 많은 문제를 안고 있습니다.

  • +0

    아이디어를 주셔서 감사합니다. 올바른 길을 찾아야합니다. – cre8or

    관련 문제