.NET MissingMethodException出现在成千上万的最终用户机器之一上 - 任何见解?

STW*_*STW 0 .net exception 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jeh*_*hof 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特定方法.