[Silverlight程序集在发布模式下编译时,IL偏移丢失

问题描述 投票:8回答:1

我关注了these instructions to add IL offsets to Silverlight stack traces。当在DEBUG模式下构建时,此方法效果很好,但是我们的生产/质量构建过程使用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")]

vs RELEASE构建:

[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 says

DebuggableAttribute类控制运行时如何处理模块内的代码。运行时可能会跟踪有关生成代码的额外信息,并且可能会基于此属性中包含的值禁用某些优化。

[任何人都没有调整DebuggableAttribute设置的经验吗?有没有不完全禁用优化的解决方法(DebuggingModes.DisableOptimizations)?

.net silverlight il
1个回答
0
投票

DebuggableAttribute由编译器添加以控制JIT代码的生成。实际上,当代码应该是可调试的并且某些优化未发生时,代码的生成方式有所不同。

[如果需要调整生成的程序集,则需要转储IL,更改属性,然后通过以下方式重新编译它:ildasm创建可被常规文本编辑器更改的可读的IL源,而ilasm用于重新编译回它。

此过程可以在您的构建中自动执行。只需记住,您正在弄乱编译器生成的内容,不应被触及。

重要:如果使用强名称和/或Authenticode,则需要再次对程序集进行签名。

© www.soinside.com 2019 - 2024. All rights reserved.