Dot-Net

在發布模式下編譯 si lverlight 程序集時缺少 IL 偏移

  • December 5, 2019

我按照這些說明將 IL 偏移添加到 Silverlight 堆棧跟踪。這在 DEBUG 模式下建構時效果很好,但是我們的生產/qa 建構過程使用 RELEASE 模式編譯所有內容,這似乎失去了 IL 偏移資訊。在發布模式下,所有 IL 偏移量最終都為“0xffffffff”。使用反射器比較調試/發布程序集我注意到DebuggableAttribute的使用方式不同。

調試建構:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ComVisible(false)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]
[assembly: AssemblyConfiguration("Debug")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows=true)]
[assembly: Extension]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: CompilationRelaxations(8)]
[assembly: TargetFramework("Silverlight,Version=v5.0", FrameworkDisplayName="Silverlight 4")]
[assembly: AssemblyCopyright("Copyright @ Foo Company 2010-2012")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyTitle("Foo.Ria.Bar")]
[assembly: AssemblyCompany("Foo Company")]
[assembly: AssemblyProduct("Foo Product")]

與發布建構:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: ComVisible(false)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows=true)]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyTitle("Foo.Ria.Bar")]
[assembly: AssemblyTrademark("")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: CompilationRelaxations(8)]
[assembly: TargetFramework("Silverlight,Version=v5.0", FrameworkDisplayName="Silverlight 4")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyCompany("Foo Company")]
[assembly: AssemblyProduct("Foo Product")

MSDN 說

DebuggableAttribute類控制執行時如何處理模組中的程式碼執行時可能會跟踪有關生成的程式碼的額外資訊,並且可能會根據此屬性中包含的值禁用某些優化。

有沒有人有調整DebuggableAttribute設置的經驗?是否有任何不涉及完全禁用優化的解決方法(DebuggingModes.DisableOptimizations)?

DebuggableAttribute編譯器添加以控制 JIT 程式碼生成。事實上,當程式碼應該是可調試的並且某些優化沒有發生時,它會以不同的方式生成。

如果您需要調整生成的程序集,您需要轉儲 IL,更改屬性並通過以下方式重新編譯它:ildasm創建一個人類可讀的 IL 原始碼,可以通過傳統文本編輯器進行更改,而ilasm用於重新編譯它.

這個過程可以在您的建構中自動化。請記住,您正在弄亂編譯器生成的某些內容,並且不應該被觸及。

重要提示:如果使用強名稱和/ir 驗證碼,則需要再次對程序集進行簽名。

引用自:https://stackoverflow.com/questions/12264543