使用3F DLLExport导出的C# DLL无法在Delphi应用中调试的问题
解决.NET Framework DLL导出至Delphi后VS调试符号无法加载的问题
问题重现
C#实现
using System; using System.Windows; using System.Runtime.InteropServices; namespace ClassLibrary1 { public class Class1 { [DllExport(CallingConvention = CallingConvention.StdCall)] public static void Init() { MessageBox.Show("Hallo von testprogramm c#"); } } }
- 项目基于.NET Framework 4.8,设置为X86架构
- 使用3F/DLLExport工具配置导出
- Debug模式编译,生成对应pdb符号文件,已启用原生代码调试
Delphi调用代码
procedure TestDLL(); var dllHandle : THandle; dllInit: PInit; begin dllHandle := SafeLoadLibrary('path\to\ClassLibrary1\bin\x86\Debug\ClassLibrary1.dll'); dllInit := GetProcAddress(dllHandle, 'Init'); dllInit(); end;
- Delphi能正常加载DLL并调用
Init函数,弹窗正常显示 - 但将VS附加到运行中的Delphi程序时,VS提示未加载该DLL的符号,无法调试C#代码
解决步骤
1. 验证符号文件一致性
- 用
dumpbin /headers命令分别检查C#项目输出目录下的ClassLibrary1.dll和ClassLibrary1.pdb,确认两者的时间戳与签名完全一致。 - 若不一致,删除C#项目的
bin和obj目录,重新编译生成最新的DLL和pdb文件。
2. 配置VS符号搜索路径
- 打开VS的
调试 > 选项 > 调试 > 符号 - 添加C#项目
bin\x86\Debug目录到符号文件(.pdb)位置列表 - 勾选Microsoft符号服务器(用于加载系统依赖的符号文件)
3. 调整附加进程的调试类型
- 打开
调试 > 附加到进程,找到运行中的Delphi进程 - 点击选择按钮,在弹出的对话框中同时勾选托管(.NET Framework)和原生代码调试类型
- 完成后再附加进程,确保VS同时调试托管和原生代码层
4. 手动加载符号
- 当Delphi程序加载DLL后,打开VS的
调试 > Windows > 模块窗口 - 找到
ClassLibrary1.dll,右键选择加载符号,手动指定C#项目bin\x86\Debug目录下的pdb文件 - 若提示符号不匹配,重新编译C#项目确保版本一致
5. 检查DLLExport配置
- 打开C#项目属性的DllExport设置页面
- 确认Platform为x86,Mode为Debug,且勾选Generate Debug Info选项
- 若项目启用了延迟签名,暂时关闭该选项后重新编译测试
6. 确认Delphi加载的DLL路径
- 检查Delphi代码中
SafeLoadLibrary的路径,确保指向C#项目bin\x86\Debug下的最新DLL文件 - 避免加载旧版本、Release版本或其他目录下的DLL
内容的提问来源于stack exchange,提问作者White
相关产品推荐
相关产品推荐

