2012-02-12 22 views
6

Tôi đã cố gắng chạy mã mẫu xuất hiện trên các trang tài liệu cho lớp System.Reflection.Emit.LocalBuilder nhưng có vẻ như các cuộc gọi đến LocalBuilder.SetLocalSymInfo(string, int, int) không làm bất cứ điều gì kể từ khi IL dissasembler thấy điều này như là IL cho SampleAssembly.dll:Tại sao LocalBuilder.SetLocalSymInfo không phát ra tên biến?

.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 

Tại sao không phải là tên biến (myStringmyInt) được liệt kê trong Dissasembler?

Môi trường Thông tin:

  • Windows 7 64 bit
  • Visual Studio 2010 Professional SP1
  • Net 4.0.30319 SP1
  • Target Framework: Net 4 Client Profile
  • cấu hình gỡ lỗi (đối với chương trình sử dụng System.Reflection.Emit)

Chỉnh sửa: Như tôi đã lưu ý trong một chú thích, có một tệp SampleAssembly.pdb được tạo cùng với tệp SampleAssembly.dll.

Trả lời

5

Hỗ trợ gỡ lỗi trong System.Reflection.Emit khá kém và kỳ quặc (và đến một mức độ nào đó điều này cũng đúng đối với IKVM.Reflection, vì nó thừa kế một số sự hỏng hóc từ API .pdb writer cơ bản mà phải được sử dụng vì định dạng tệp .pdb không được ghi lại).

Dù sao, lý do mẫu không hoạt động là nó thiếu đoạn mã sau:

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

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

Phải có ít nhất một điểm chuỗi duy nhất trong phương pháp, bởi vì đó là con đường nội bộ cấu trúc dữ liệu được gắn với nhau.

+0

Cảm ơn bạn, tôi sẽ trao cho bạn tiền thưởng của tôi khi tôi có thể, (trong 17 giờ, 200 điểm) nhưng không thể đánh dấu câu trả lời này là câu trả lời chính xác vì tôi không hỏi câu hỏi gốc! – thr

+0

Có chúng tôi đi, tiền thưởng được trao, xin lỗi vì sự chậm trễ :) – thr

1

Tôi nghi ngờ điều này là do bạn đang xây dựng mô-đun dưới dạng bản phát hành DLL.

Hãy thử qua true như tham số thứ hai để AssemblyBuilder.DefineDynamicModule

+0

Nếu bạn nhìn vào mẫu tôi liên kết, tác giả đang gọi 'AssemblyBuilder.DefinDynamicModule (chuỗi, chuỗi, đúng)'. Tôi cũng có thể thấy rằng có một tệp SampleAssembly.pdb trong thư mục hiện tại. –

1

tên Symbol được lưu trữ trong các tập tin PDB và không có trong hội đồng.

Một công cụ như Reflector.NET sẽ tải tệp PDB nếu có để cung cấp cho các tên mã được tách rời của bạn tốt hơn.

Bạn cũng có thể xác minh điều này bằng cách gỡ lỗi mã trong trình gỡ lỗi có và không có tệp PDB.

+1

Tôi đã kiểm tra tệp .pdb, không có gì ở đó! – thr

Các vấn đề liên quan