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
方法由C#编译器生成,标记为“native”。这意味着CLR将提供实现EndInvoke
- 紧凑框架CLR
- 当JIT编译器第一次执行一个方法时,它会查找它可能调用的所有方法(加载其他程序集等)
- 由于CLR不支持委托.BeginInvoke,因此任何调用它的方法都无法JIT编译,因此无法执行
- 第一次调用
时会抛出OnBarcodeScan
(JIT编译器尝试编译它,但失败)。这就是调试器无法进入的原因NotSupportedException
- 压缩框架不支持异步委托调用(即
BeginInvoke
)
至于调试器甚至不会进入该方法的原因,我相信是因为以下原因:
/BeginInvoke
方法由C#编译器生成,标记为“native”。这意味着CLR将提供实现EndInvoke
- 紧凑框架CLR
- 当JIT编译器第一次执行一个方法时,它会查找它可能调用的所有方法(加载其他程序集等)
- 由于CLR不支持委托.BeginInvoke,因此任何调用它的方法都无法JIT编译,因此无法执行
- 第一次调用
时会抛出OnBarcodeScan
(JIT编译器尝试编译它,但失败)。这就是调试器无法进入的原因NotSupportedException
调试器.Break()
statement?如果未命中断点,有时这会有所帮助……您肯定在调试配置中设置了断点,并且定义了调试预处理程序?@JaredPar-visualstudio2008@ctacke-我在调试配置中有它,并且在项目选项中选中了调试预调试。在更改方法之前,我能够很好地进行调试。实际上,我所做的只是交换注释,以便调用BeginInvoke。正如我所述,它失败了。您使用的是Visual Studio的哪个版本?您是否尝试插入调试器.Break()
statement?如果未命中断点,有时这会有所帮助……您肯定在调试配置中设置了断点,并且定义了调试预处理程序?@JaredPar-visualstudio2008@ctacke-我在调试配置中有它,并且在项目选项中选中了调试预调试。在更改方法之前,我能够很好地进行调试。实际上,我所做的就是交换注释,以便调用BeginInvoke。正如我所描述的那样,它失败了。这是一个很好的回答!非常感谢。我最终在线程中创建了一个线程并调用了Invoke from。这很好。这是一个很好的回答!非常感谢。我最终在线程中创建了一个线程并调用了Invoke from。这很好.