2012-02-12 5 views
6

는 내가 System.Reflection.Emit.LocalBuilder 클래스의 문서 페이지에 나타나는 샘플 코드를 실행 시도하지만 IL Dissasembler 보여줍니다부터 LocalBuilder.SetLocalSymInfo(string, int, int)에 대한 호출이 SampleAssembly.dll의 IL으로이 작업을 수행하지 않는 것으로 나타납니다LocalBuilder.SetLocalSymInfo가 변수 이름을 표시하지 않는 이유는 무엇입니까?

.method public static string Function1(int32 A_0) cil managed 
{ 
    // Code size  10 (0xa) 
    .maxstack 1 
    .locals init (string V_0, 
      int32 V_1) 
    IL_0000: ldarg.0 
    IL_0001: stloc.1 
    IL_0002: ldstr  "string value" 
    IL_0007: stloc.0 
    IL_0008: ldloc.0 
    IL_0009: ret 
} // end of method Example::Function1 

왜 Dissasembler에 변수 이름 (myStringmyInt)이 나열되지 않습니까?

환경 정보 :

  • 윈도우 7 64 비트
  • 비주얼 스튜디오 2010 프로페셔널 SP1
  • 닷넷 4.0.30319 SP1
  • 대상 프레임 워크 : 닷넷 4 클라이언트 프로파일
  • 디버그 구성 (System.Reflection.Emit을 사용하는 프로그램의 경우)

편집 : 주석에서 언급했듯이 SampleAssembly.pdb 파일이 SampleAssembly.dll 파일과 함께 생성됩니다.

답변

5

System.Reflection.Emit의 디버깅 지원은 매우 불량하고 기발합니다 (그리고 어느 정도까지는 IKVM.Reflection에도 해당됩니다. 왜냐하면이 API는 기본 .pdb 작성기 API에서 손상된 부분을 상속하기 때문입니다. .pdb 파일 형식이 문서화되지 않았으므로 사용하십시오.

어쨌든, 샘플이 작동하지 않는 이유는 다음과 같은 코드가 누락 것입니다 :

ISymbolDocumentWriter doc = myModule.DefineDocument("sourcefile", Guid.Empty, Guid.Empty, Guid.Empty); 

myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0); 

그 방법은 내부이기 때문에, 방법에있어서, 적어도 하나의 시퀀스 지점이 있어야합니다 데이터 구조는 서로 연결되어 있습니다.

+0

고맙습니다. 할 수있을 때 (17 시간 후에 +200 점) 부탁드립니다. 원래 질문을하지 않았으므로 정답으로 표시하지 마십시오! – thr

+0

우리가 가서, 현상금 수여, 지연에 대한 미안 :) – thr

1

나는 그것이 릴리스 DLL로 모듈을 빌드하기 때문에 이것이라고 생각됩니다.

AssemblyBuilder.DefineDynamicModule

+0

내가 링크 된 샘플을 보면, 저자는'AssemblyBuilder.DefinDynamicModule (string, string, true)'를 호출하고있다. 현재 디렉터리에 SampleAssembly.pdb 파일이 있음을 알 수 있습니다. –

1

기호 이름이 어셈블리의 PDB 파일에 저장되지 않습니다에 두 번째 매개 변수로 true을 통과하십시오.

Reflector.NET과 같은 도구는 디스 어셈블리 된 코드의 이름을 더 잘 나타 내기 위해 PDB 파일을로드합니다.

또한 PDB 파일이 있거나없는 디버거에서 코드를 디버깅하여 확인할 수 있습니다.

+1

.pdb 파일을 검사했지만 거기에 아무것도 없습니다! – thr

관련 문제