如何从Visual Studio调试非托管Delphi代码

本文关键字:Delphi 代码 调试 Visual Studio | 更新日期: 2023-09-27 18:19:28

我有一个调用C#dll的Delphi项目,现在问题是从HydraModuleController assembly.GetType()语句调用的dll程序集类型,该语句为一个或多个类型返回空值。我尝试通过以下步骤从Visual Studio调试Delphi代码。调试->附加到进程。。。选择正在运行的进程。单击"附加到"右侧的"选择…"按钮。选择"调试这些代码类型"对于.NET 3.5或更低版本,请选中Managed(v2.0、v1.1、v1.0),对于.NET 4.0或更高版本,请选择Managed(v4.0)。单击"确定",然后单击"附加"。

但是当仍然无法从VS调试时。我该怎么办?这是从C#dll调用AssemblyResolver的Delphi代码。

try
 fAssembly.CreateInstance_2('WPFProj.AssemblyResolver', true);
   except

下面是名为dll程序集类型的Delphi代码。

procedure THYManagedModuleController.CreateManagedControllerInstance;
var
  lTypes:PSafeArray;
  lType:_Type;
  lStart,lEnd,i:integer;
  lVariant: OleVariant;
begin
  lTypes := fAssembly.GetTypes();
  SafeArrayLock(lTypes);
......
end

这是WPF项目中的AssemblyResolver.cs。

 public class AssemblyResolver
{
    static AssemblyResolver()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    }
    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        Assembly asm = Assembly.GetExecutingAssembly();
        AssemblyName an = new AssemblyName(args.Name);
        Stream stream =
    asm.GetManifestResourceStream(String.Format("WPFProj.Includes.{0}.dll",
    an.Name));
        if (stream == null)
            return null;
        byte[] block = new byte[stream.Length];
        stream.Read(block, 0, block.Length);
        Assembly resolved = Assembly.Load(block);
        return resolved;
    }
}

如何从Visual Studio调试非托管Delphi代码

您无法从Visual Studio调试Delphi代码。Visual Studio调试依赖于使用Microsoft专有PDB格式的调试信息。Delphi编译器以其专有的DCU格式生成调试信息。

要调试Delphi代码,您需要Delphi IDE,RAD Studio。要调试C#代码,您需要Microsoft IDE Visual Studio。

现在我可以解决这个问题了。实际上,当我们在Delphi exe中使用.net dll时,我们可以在Hydra for Delphi中捕获Visual Studio中非托管代码的异常。我在Visual Studio中做了一些更改。转到项目->项目属性->选择调试模式->选择启动外部程序->浏览Delphi exe文件路径。然后转到调试->异常->检查公共语言运行时异常。仅此而已。然后,当你运行你的.net项目时,它也会运行Delphi项目,并在Delphi中捕获非托管代码的异常。