如何从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调试依赖于使用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中捕获非托管代码的异常。