我想要进入一个由[MethodImpl(MethodImplOptions.InternalCall)]
修饰的BCL方法的实现,这个方法很可能是用C++实现的。(特别是在我看System.String.nativeCompareOrdinal 的时候)这主要是因为我好奇,想知道它是如何实现的。
然而,Visual Studio调试器拒绝进入该方法。我可以在这个调用上设置断点:
"Hello".Equals("hello", StringComparison.OrdinalIgnoreCase);
然后打开调试(Debug) > 窗口(Windows) > 反汇编(Disassembly),进入Equals调用并单步执行,直到它到达
call
x86 指令。但是,当我尝试对call
使用"单步调试"功能(我知道从反编译器(Reflector)中,这是nativeCompareOrdinal调用),它不会像我期望的那样跳转到nativeCompareOrdinal内部的第一条指令,而是跳过该方法,直接进入Equals中下一个x86指令。由于混合模式调试不支持x64应用程序,因此我正在以x86方式构建。我在 "工具(Tools) > 选项(Options) > 调试(Debugging)" 中取消了 "我的代码(Just My Code)" ,在项目属性(Project Properties) > 调试(Debug)选项卡中勾选了"启用非托管代码调试",但它仍然跳过了
call
。我还尝试启动进程,然后附加调试器,并显式附加托管和本机调试器,但仍无法进入该InternalCall方法。如何使Visual Studio调试器可以进入非托管方法?