更改编译配置时.NET组件行为的差异

时间:2013-01-12 17:33:27

标签: asp.net compilation dynamic-assemblies

我遇到了一段行为不同的代码问题,具体取决于它是在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)而不是底层的“真实”程序集。

奇怪的是,我在同一个网站上运行另一个使用相同代码的组件,无论编译模式如何,行为都相同。

为什么会发生这种情况以及如何预防?

2 个答案:

答案 0 :(得分:1)

启用优化时,可能会将该函数内联到另一个程序集中。根据{{​​3}}尝试添加MethodImplOptions.NoInlining,以便该方法位于您认为的汇编中。

答案 1 :(得分:0)

异常表示程序集没有 GUID属性。如果程序集未设置为COM可见 1 ,则可以在发布模式下由编译器对其进行优化。检查您的其他工作程序集,看它 是否已注册COM interop。

1 GUID仅用于COM组件的.NET程序集。 Visual Studio通过在您创建新项目时自动为您添加GUID,以防您想要进行COM互操作,但是否则它是无用的。