0

我遇到了一段代码的问题,该代码的行为不同,具体取决于它是在 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 模式下编译后执行时出现异常。它在调试模式下正常工作。这是因为在此配置中,由 GetExecutingAssembly() 创建的程序集引用是临时程序集(例如,App_Web_eelfd0ff,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null),而不是底层的“真实”程序集。

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

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

4

2 回答 2

1

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

于 2013-01-13T09:10:52.267 回答
0

异常意味着程序集没有GUID 属性。猜测一下,如果程序集未设置为 COM visible 1 ,编译器可能会在发布模式下对其进行优化。检查您的其他工作程序集以查看它是否已注册用于 COM 互操作。

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

于 2013-01-12T19:07:55.030 回答