【问题标题】:Loading Native DLL as Debug Module in Managed C# Code for Windows CE在 Windows CE 的托管 C# 代码中将本机 DLL 作为调试模块加载
【发布时间】:2009-07-11 03:07:02
【问题描述】:

我正在用 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 以进行调试?

【问题讨论】:

  • 如果您尝试在 VS 中手动加载 DLL 的符号(通过在“模块”窗口中右键单击它),然后指定您的 .pdb 文件,会发生什么情况?
  • DLL 本身不显示。虽然我可以从应用程序中调用 DLL 中的函数。

标签: c# c++ debugging interop windows-ce


【解决方案1】:

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

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

总之,问了同样的问题,得到的回答是:

不,您不能通过 P/Invoke 调用从托管代码单步执行本机代码 智能设备调试器中的代码。您也许可以使用附加到 进行本机调试的过程(将本机 DLL 项目加载到 VS2005 的那个实例),或者只是从本机编写调试信息 DLL到串口什么的。这个真的不常出现 但是,您实际上需要从一个到另一个。

在线程中,有人想出了如何做到这一点:

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

奇怪的是,当您运行 C# 程序并调用本机 DLL 代码时,它仍然没有在调试模块窗口中显示为已加载。但是,如果您将DLL项目设置为启动项目,然后在Debugging选项中将Remote Executable设置为EXE文件,那么当您第一次调用DLL时,它将在调试器中加载。好吧...不管用什么!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您能够调用 DLL 中的函数而不会引发应用程序,那么您很可能正在加载 DLL。不过,您可能需要确保在您的项目属性中启用了无管理调试。

      Unable to set breakpoints in C DLL used by C++/CLI called from C#

      【讨论】:

      • 奇怪...这似乎是票。尽管在项目属性的调试选项卡上,我没有“启用非托管代码调试”复选框。也许是因为这是一个 Windows CE 项目?
      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多