繁体   English   中英

在Windows CE的托管C#代码中加载本机DLL作为调试模块

[英]Loading Native DLL as Debug Module in Managed C# Code for Windows CE

我在C#中编写一个Windows CE应用程序,它使用以下方法引用本机C ++ DLL(我也在编码):

   [DllImport("CImg_IP_CE.dll")]
   public static unsafe extern void doBlur(byte* imgData, int sigma);

这实际上工作正常,但我无法调试DLL。 当我检查运行EXE后加载的调试模块时,CImg_IP_CE.dll不是其中之一。 即使从DLL成功调用函数后,它仍然不会出现在模块列表中。

环顾四周,似乎LoadLibrary()函数可能有效,但我找不到在C#Windows CE应用程序中使用它的任何示例。 我该怎么做或有更好的方法来确保DLL加载调试?

我通过这篇文章找到了答案:

http://www.eggheadcafe.com/conversation.aspx?messageid=31762078&threadid=31762074

总之,提出了同样的问题,答复是:

不,您无法通过P / Invoke调用从托管代码步入智能设备调试器中的本机代码。 您可以使用Attach to Process来执行本机调试(将本机DLL项目加载到VS2005的该实例中),或者只是将调试信息从本机DLL写入串行端口或其他东西。 然而,这实际上并不常见,实际上你需要从一个步骤到另一个步骤。

在线程中,有人想出如何实现这个目标:

快速测试表明,处理此问题的最简单方法是“运行”您的DLL。 也就是说,设置调试选项以启动将使用您的DLL并在DLL中设置断点的托管代码EXE(当然,所有这些都来自DLL项目)。 当然,当EXE启动时,您的DLL将不会被加载,因此您将看到断点为空心圆圈! 在它们上,但是,当你调用DLL中的任何本机函数时,DLL将被加载(它在启动时没有加载),并且将设置断点。

奇怪的是,当您运行C#程序并调用本机DLL代码时,它仍然没有在调试模块窗口中显示为已加载。 但是,如果将DLL项目设置为启动项目,然后将“远程可执行文件”设置为“调试”选项中的EXE文件,则在第一次调用DLL时,它将在调试器中加载。 好的......无论有效!

不幸的是,似乎不支持WinCE混合模式调试。 也就是说,您可以将您的进程调试为托管(因此您可以单步执行并在C#代码中设置断点),或者作为本机调试(因此您可以对本机代码执行相同操作,包括此DLL),但不能同时在同时。

要在C#项目上以纯模式运行调试,您可以执行以下操作:启动应用程序而不进行调试(Ctrl + F5或调试 - >启动而不调试),然后调试 - >附加到进程,将“传输”设置为“智能设备” ,从“限定符”下拉列表中选择模拟器,单击“附加到”字段上的“选择”按钮,然后选中“本机”。 您将观察到它不会让您同时检查两者,但如果您只需要调试DLL,则可能就足够了......

如果您能够在不抛出应用程序的情况下调用DLL中的函数,则很可能是在加载DLL。 您可能需要确保在项目属性中启用了无法调试。

无法在从C#调用的C ++ / CLI使用的C DLL中设置断点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM