Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net MethodNotFound、singleton类和;“优化代码”;_.net_Compact Framework_Singleton_Methodnotfound - Fatal编程技术网

.net MethodNotFound、singleton类和;“优化代码”;

.net MethodNotFound、singleton类和;“优化代码”;,.net,compact-framework,singleton,methodnotfound,.net,Compact Framework,Singleton,Methodnotfound,我正在用c#编写一个.net compact framework应用程序。它在开发环境中工作得很好,但在发布模式下构建并自行运行时,它会抛出MethodNotFound异常。我撒了一堆调试日志代码,以找出它在哪里被破坏,并将其缩小为一个大的Init()函数。这反过来调用多个单例类上的方法,这些单例类的实现方式如下: private SingletonClass() {} private static readonly SingletonClass _instance = new Singlet

我正在用c#编写一个.net compact framework应用程序。它在开发环境中工作得很好,但在发布模式下构建并自行运行时,它会抛出MethodNotFound异常。我撒了一堆调试日志代码,以找出它在哪里被破坏,并将其缩小为一个大的Init()函数。这反过来调用多个单例类上的方法,这些单例类的实现方式如下:

private SingletonClass() {}

private static readonly SingletonClass _instance = new SingletonClass();
public static SingletonClass Instance
{
 get
 {
  return _instance;
 }
}
我注意到的一件事是,singleton类中构造函数的调试条目将在Init()函数的第一个条目之前被记录。看起来运行时引擎在真正开始运行我的代码之前做了一些事情

一旦我在这些单例类中有了“足够”的调试代码,它就不会抛出MethodNotFound异常,程序也会正常运行。我之所以说“够了”,是因为我可以注释掉调试代码并获得MethodNotFound。当我再次取消评论时,它起了作用

奇怪的是,当没有抛出异常时,调试日志条目将按照我的代码调用它们的顺序。这几乎就像运行时引擎没有像抛出MethodNotFound时那样进行“隐藏”操作一样

我尝试在有单例类的项目上清除“优化代码”选项,似乎解决了这个问题。(我一开始尝试过这一点,但从中了解到UI项目上的项目选项不会影响业务逻辑项目。)

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

我确实找到了一篇关于编译器如何处理单例类中使用的静态内容的帖子

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


所以我的问题是到底发生了什么?它起作用了,所以这是一个学术问题。希望这能帮其他人省去麻烦。

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

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

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

可以将方法标记为不可与属性内联。尝试将此应用于通过添加调试代码“修复”的函数之一

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

在上面的链接中:“一个非常好的内联候选对象的典型示例是属性getter/setter。”我在“Instance”属性的“get”语句中添加了[MethodImpl(MethodImplOptions.NoInlining)],选中了“Optimize code”,结果成功了。好球!谢谢你的提示。