使用VS2010在混合C#C(win32)项目中未加载符号

我的项目有几个新的C#模块和一个使用win32系统调用编译的C模块(不是C ++)。 我正在使用PInvoke互操作层从C#调用C代码。 C函数被调用。

所有模块都写入单个bin目录和所有写入pdb文件。

在运行,然后在调用C.dll之前在断点处停止时,我看到C模块中的断点被禁用。 查看Debug | Windows | Modules列表,即使在执行调用后,我也看不到C.dll模块已加载。

另一个事实:在解决方案|属性|配置属性|配置中显示使用Platform =“Any CPU”的C#模块和使用“Win32”的C模块

为什么不加载模块,为什么不加载它的符号?

谢谢,马克斯

我从几个来源巩固了答案。

  • 你在运行调试配置吗?
    在解决方案中检查:SolnExplorer |解决方案|属性| ConfigurationProperties | 配置=调试
    和:SolnExplorer |解决方案|属性| ConfigurationProperties | Configuration | ProjectConfig [] = Debug – >注意:虽然断点可以与发布配置一起使用,但有时可以优化或重新排列行。

  • 你在生成调试信息吗? 在C#项目中:SolnExplorer |项目|属性| ConfigurationProperties |链接器|调试|生成调试信息=是
    在C ++项目中:SolnExplorer |项目|属性| ConfigurationProperties | C / C ++ |调试信息格式=程序数据库(/ Zi)
    – >注意:检查命令行参数是值得的。

  • 一切都在重建吗? 如果PDB不同步,调试器可能无法加载符号:
    在解决方案中:所有项目的SolnExplorer |解决方案|属性|配置属性| Build = TRUE(已选中)。

  • 你可以调试非托管代码吗?
    在C#项目中:SolnExplorer |项目|属性|调试|启用非托管代码debugging = TRUE(已检查)
    在C / C ++项目中:SolnExplorer |属性|配置属性|调试|调试器类型=混合

  • 文件是否放在您认为的位置? 我使用单个bin \ debug目录来收集所有项目DLL和PDB。
    在C#项目中:SolnExplorer |项目|属性|构建|输出路径= .. \ bin \ debug
    在C / C ++项目中:SolnExplorer |项目|属性| ConfigProp |链接器| OutputFile = .. \ bin \ debug \ $(TargetName)$(TargetExt)

  • 旧文件是否会妨碍? 检查bin目录中所有输出文件的时间戳。 确保它们是最后一次重建时的结果。
    有些人建议吹掉所有的bin和obj目录。 这可能是值得的,只是为了看到旧文件没有铺设。 检查时间和日期标记也应该这样做。

  • DLL已加载? 如果禁用断点,则可能是因为尚未加载DLL。 选中菜单|调试| Windows |模块。
    在模块名称中查找dll。
    在相同的模块窗口中,确保从正确的路径加载文件。
    如果程序集在多个程序之间共享,则可以从GAC加载。
    – >注意:您可以在需要之前预加载C / C ++ DLL。 使用:IntPtr lpDLL = LoadLibrary(myLibraryName);

我在C#中有一个带有C ++ DLL的Windows服务。 我看到的问题是Max指出:

  • DLL工作,但从未出现在模块窗口中。

我做了很多搜索,这是一个很好的列表,与许多其他来源的信息相匹配。

要使ikh的注释明确:

  • “Auto”对我不起作用,但在Attach对话框中明确设置“Native”和“Managed”代码。

这是我的五十美分。 在我的情况下,似乎我的c ++ / cli项目的pdb文件不再更新,而我的c#项目的pdb文件是。 这可能使它们无效并使调试器无法加载它们。

我记得已经移动了我项目的源代码库。 经过一点点的讨论,我发现一些绝对路径问题可能是问题所在。 运行git clean -dfx为我解决了这个问题。