首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MethodNotFound、单例类和“优化代码”

MethodNotFound、单例类和“优化代码”
EN

Stack Overflow用户
提问于 2010-01-08 23:21:21
回答 1查看 182关注 0票数 2

我正在用.net编写一个c#紧凑框架应用程序。它在开发环境中运行良好,但是当它在发布模式中内置并自行运行时,它会抛出MethodNotFound异常。我撒了一堆调试日志代码,以找出它在哪里崩溃,并将其缩小到一个大型的Init()函数。这反过来调用了几个单例类上的方法,这些类实现如下:

代码语言:javascript
复制
private SingletonClass() {}

private static readonly SingletonClass _instance = new SingletonClass();
public static SingletonClass Instance
{
 get
 {
  return _instance;
 }
}

我注意到的一件事是,在Init()函数的第一个条目之前,将记录来自singleton类中构建器的调试条目。看起来运行时引擎在真正开始运行我的代码之前正在做一些事情。

一旦我在这些单例类中有了“足够”的调试代码,它就不会抛出MethodNotFound异常,程序就会运行得很好。我说“够了”,因为我可以注释掉调试代码并获得MethodNotFound。当我再次评论它的时候,它成功了。

奇怪的是,当未引发异常时,调试日志条目将按照我的代码调用它们的顺序进行。这几乎就像运行时引擎在抛出MethodNotFound时所做的“在引擎罩下”的事情一样。

我试着清除带有单例类的项目上的“优化代码”选项,它似乎解决了这个问题。(一开始我尝试过这种方法,但很难理解UI项目上的项目选项不会影响业务逻辑项目。)

我找到的关于MethodNotFound的几篇文章谈到了缺少DLL、DLL版本错误或内存不足的问题。

我确实找到了一篇文章,其中谈到了编译器如何处理单例类中使用的静态内容。

http://www.yoda.arachsys.com/csharp/singleton.html

我认为这与我遇到的问题有关,但最终我必须清除“优化代码”才能使其正常工作。

所以我的问题是到底是怎么回事?它起作用了,所以这是一个学术问题。希望这能减轻别人的头痛。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-11 14:02:26

您是否在代码中的任何地方使用反射来遍历调用堆栈?(搜索StackFrame或StackTrace类)

在优化代码时,小函数通常是内联的,这意味着在发布版本中,特定的方法可能会完全从调用堆栈中消失。如果您期望调用堆栈中存在该方法,则可能会看到内联。

当您将调试代码添加到一个小函数中时,我猜想JIT将停止将其判断为一个不可链接的函数,因此该方法返回到调用堆栈中,您的问题就消失了。

您可以使用CompilerServices.MethodImpl属性将方法标记为不可内联。尝试通过添加调试代码将其应用到一个“固定”的函数中。

另见http://blogs.msdn.com/davidnotario/archive/2004/11/01/250398.aspx

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2031477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档