You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:53:24