我遇到了一段行为不同的代码问题,具体取决于它是在Visual Studio中的Release或Debug配置中编译的。我手动修改了我在Release配置上看到的所有项目编译设置,以便它与Debug配置相匹配,但问题仍然存在。
代码(下面)返回正在执行的程序集的Guid:
private static Guid GetApplicationUid()
{
Assembly assembly = Assembly.GetCallingAssembly();
GuidAttribute attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), false)[0];
return new Guid(attribute.Value);
}
该方法失败,并且“索引超出了数组的范围”。在发布模式下编译后执行时的异常。它在调试模式下正常工作。这是因为在这种配置中,GetExecutingAssembly()创建的程序集引用是一个临时程序集(例如App_Web_eelfd0ff,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null)而不是底层的“真实”程序集。
奇怪的是,我在同一个网站上运行另一个使用相同代码的组件,无论编译模式如何,行为都相同。
为什么会发生这种情况以及如何预防?
答案 0 :(得分:1)
启用优化时,可能会将该函数内联到另一个程序集中。根据{{3}}尝试添加MethodImplOptions.NoInlining
,以便该方法位于您认为的汇编中。
答案 1 :(得分:0)
异常表示程序集没有 GUID属性。如果程序集未设置为COM可见 1 ,则可以在发布模式下由编译器对其进行优化。检查您的其他工作程序集,看它 是否已注册COM interop。
1 GUID仅用于COM组件的.NET程序集。 Visual Studio通过在您创建新项目时自动为您添加GUID,以防您想要进行COM互操作,但是否则它是无用的。