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



我遇到了一段代码的问题,它的行为不同,这取决于它是在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); 
}

在Release模式下编译后执行该方法时,方法失败,并出现"Index was outside of The array."异常。它在调试模式下正常工作。原因是在该配置中,GetExecutingAssembly((创建的程序集引用指向临时程序集(例如,App_Web_eelfd0ff,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null(,而不是底层的"真实"程序集。

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

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

当启用优化时,函数可能被内联到不同的程序集中。根据这个答案,尝试添加MethodImplOptions.NoInlining,以便该方法在您认为的程序集中。

异常表示程序集没有GUID属性。据推测,如果程序集未设置为COM可见1,则编译器可能会在发布模式下对其进行优化。检查另一个工作程序集,查看它是否已注册用于COM互操作。

1GUID仅用于COM互操作的.NET程序集中。Visual Studio通过在创建新项目时自动为您添加GUID,以防您想要执行COM互操作,但除此之外,它毫无用处。