Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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
C# 用BeginInvoke调试古怪_C#_.net_Debugging_Compact Framework - Fatal编程技术网

C# 用BeginInvoke调试古怪

C# 用BeginInvoke调试古怪,c#,.net,debugging,compact-framework,C#,.net,Debugging,Compact Framework,我有以下方法: protected void OnBarcodeScan(BarcodeScannerEventArgs e) { if (BarcodeScan != null) { //BarcodeScan.BeginInvoke(e, null, null); BarcodeScan(e); } } 当我尝试采用上述方法时,效果很好。我能够介入并覆盖该方法的所有部分 但是,如果我切换注释(因此BarcodeScan(e)被注释掉,

我有以下方法:

protected void OnBarcodeScan(BarcodeScannerEventArgs e)
{
    if (BarcodeScan != null)
    {
        //BarcodeScan.BeginInvoke(e, null, null);
        BarcodeScan(e);
    }
}
当我尝试采用上述方法时,效果很好。我能够介入并覆盖该方法的所有部分

但是,如果我切换注释(因此
BarcodeScan(e)
被注释掉,并删除
BarcodeScan.BeginInvoke(e,null,null)
上的注释,则我无法进入OnBarcodeScan方法的任何部分(即
上的断点,如果(BarcodeScan!=null)
未被命中

我也试着把一些调试语句放在那里,但只要begininvoke调用在那里,它就不允许我进入这个方法

我检查了输出,当我尝试介入时,它说:

ScannerTest.exe中首次出现类型为“System.NotSupportedException”的异常 单步执行:单步执行不带符号的方法'Symbol.Marshaller.SymbolMessageWindow.WndProc' 单步执行:单步执行不带符号“Microsoft.WindowsCE.Forms.MessageWindow.\u WndProc”的方法

为什么整个方法都是不可能的,当它有一个开端的时候


任何帮助都很好!

紧凑型框架不支持异步委托调用(即,
BeginInvoke

至于调试器甚至不会进入该方法的原因,我相信是因为以下原因:

  • BeginInvoke
    /
    EndInvoke
    方法由C#编译器生成,标记为“native”。这意味着CLR将提供实现
  • 紧凑框架CLR
  • 当JIT编译器第一次执行一个方法时,它会查找它可能调用的所有方法(加载其他程序集等)
  • 由于CLR不支持委托.BeginInvoke,因此任何调用它的方法都无法JIT编译,因此无法执行
  • 第一次调用
    OnBarcodeScan
    时会抛出
    NotSupportedException
    (JIT编译器尝试编译它,但失败)。这就是调试器无法进入的原因

    • 压缩框架不支持异步委托调用(即
      BeginInvoke

      至于调试器甚至不会进入该方法的原因,我相信是因为以下原因:

      • BeginInvoke
        /
        EndInvoke
        方法由C#编译器生成,标记为“native”。这意味着CLR将提供实现
      • 紧凑框架CLR
      • 当JIT编译器第一次执行一个方法时,它会查找它可能调用的所有方法(加载其他程序集等)
      • 由于CLR不支持委托.BeginInvoke,因此任何调用它的方法都无法JIT编译,因此无法执行
      • 第一次调用
        OnBarcodeScan
        时会抛出
        NotSupportedException
        (JIT编译器尝试编译它,但失败)。这就是调试器无法进入的原因

      您正在使用哪个版本的Visual Studio?是否尝试插入
      调试器.Break()
      statement?如果未命中断点,有时这会有所帮助……您肯定在调试配置中设置了断点,并且定义了调试预处理程序?@JaredPar-visualstudio2008@ctacke-我在调试配置中有它,并且在项目选项中选中了调试预调试。在更改方法之前,我能够很好地进行调试。实际上,我所做的只是交换注释,以便调用BeginInvoke。正如我所述,它失败了。您使用的是Visual Studio的哪个版本?您是否尝试插入
      调试器.Break()
      statement?如果未命中断点,有时这会有所帮助……您肯定在调试配置中设置了断点,并且定义了调试预处理程序?@JaredPar-visualstudio2008@ctacke-我在调试配置中有它,并且在项目选项中选中了调试预调试。在更改方法之前,我能够很好地进行调试。实际上,我所做的就是交换注释,以便调用BeginInvoke。正如我所描述的那样,它失败了。这是一个很好的回答!非常感谢。我最终在线程中创建了一个线程并调用了Invoke from。这很好。这是一个很好的回答!非常感谢。我最终在线程中创建了一个线程并调用了Invoke from。这很好.