2009-07-08 47 views
0

这个问题已经困惑了我,它的影响单个用户(据我所知)并没有被我们再现....NET MissingMethodException发生在数千个最终用户机器中的任何一台机器上 - 有什么见解?

  • 用户正在接收MissingMethodException,我们跟踪文件表明它是后存在的我们创建一个组件的新实例,当我们调用一个Initialize/Setup方法来准备工作时(例如InitializeWorkerByArgument)

  • 错误指定的方法是一个接口方法,它是一个接口方法基类实现和派生自基类的类可以按需覆盖

  • 用户必须提供的所有代码附带一个组件内我们的应用程序

  • 最新发布的

这里的组件非常蒸馏版本:

class Widget : UserControl 
{ 

    public void DoSomething(string argument) 
    { 
     InitializeWorkerByArgument(argument); 
     this.Worker.DoWork(); 
    } 

    private void InitializeWorkerByArgument(string argument) 
    { 
     switch (argument) 
     { 
      case "SomeArgument": 
       this.Worker = new SomeWidgetWorker(); 
       break; 
     } 

     // The issue I'm tracking down would have occured during "new SomeWidgetWorker()" 
     // and would have resulted in a missing method exception stating that 
     // method "DoWork" could not be found. 

     this.Worker.DoWorkComplete += new EventHandler(Worker_DoWorkComplete); 
    } 

    private IWidgetWorker Worker 
    { 
     get; 
     set; 
    } 

    void Worker_DoWorkComplete(object sender, EventArgs e) 
    { 
     MessageBox.Show("All done"); 
    } 
} 

interface IWidgetWorker 
{ 
    void DoWork(); 
    event EventHandler DoWorkComplete; 
} 

abstract class BaseWorker : IWidgetWorker 
{ 
    virtual public void DoWork() 
    { 
     System.Threading.Thread.Sleep(1000); 
     RaiseDoWorkComplete(this, null); 
    } 

    internal void RaiseDoWorkComplete(object sender, EventArgs e) 
    { 
     if (DoWorkComplete != null) 
     { 
      DoWorkComplete(this, null); 
     } 
    } 

    public event EventHandler DoWorkComplete; 
} 

class SomeWidgetWorker : BaseWorker 
{ 
    public override void DoWork() 
    { 
     System.Threading.Thread.Sleep(2000); 
     RaiseDoWorkComplete(this, null); 
    } 
} 

回答

1

鉴于问题的罕见性,这似乎可能是由于该用户计算机上的软件环境破坏造成的。

+1

我倾向于同意,但最终用户自然是一个非常讨厌的人来处理 - 所以我尽我所能进行尽职调查之前假设它是针对他们的一个工作站的 – STW 2009-07-08 11:43:53

+2

它总是这样,它必须有一个“法律”的名称,你一定在做正确的事情,缩小问题的范围,然后你从事实不是这个假设对于某个人来说总是很难辩驳,有可能是这个用户拥有*完成*而不是一个随机问题。 – Lazarus 2009-07-08 11:54:25

1

任何机会,这是一个.NET框架依赖问题,这个用户没有所需的.NET版本?只是一个想法。

+0

我怀疑它 - 但不能排除;我们有一个坚实的框架2.0的要求,并没有发现任何用户在不兼容版本上运行的问题 - 但是当我进入办公室时,我需要从我们的遥测数据中验证用户的框架。 – STW 2009-07-08 11:42:45

+0

Negative - 该站拥有从1.0到3.5的所有最新信息:( – STW 2009-07-08 14:09:07

6

这听起来像您正在使用.NET Framework 2.0的SP中发布的方法。

我有和我用方法相同的问题WaitOne(int)ManualResetEvent。我不得不用替换它WaitOne(int,bool)

方法在.NET Framework SP 2中添加了WaitOne(int),在安装.NET Framework 3.5 SP1时应用了此方法。

在这种情况下,我建议阅读MSDN。 “版本信息”告诉您在哪个框架或Service Pack中支持特定的方法。

1

问题机器上的操作系统是否与其他机器不同?我在几年前调试了一个类似的错误,我认为认为我将其追溯到.Net类型解析领域中一种特殊风格的Windows上的奇怪行为。

相关问题