1

我有调用 C# dll 的 Delphi 项目现在问题是从 HydraModuleController assembly.GetType() 语句调用的 dll 程序集类型,该语句返回一种或多种类型的空值。我尝试通过以下步骤从 Visual Studio 调试 Delphi 代码。Debug -> Attach to process... 选择正在运行的进程。单击“附加到”右侧的“选择...”按钮。选择“调试这些代码类型”检查 .NET 3.5 或更低版本的托管(v2.0、v1.1、v1.0)或 .NET 4.0 或更高版本的托管(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;
    }
}
4

2 回答 2

2

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

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

于 2014-08-27T06:29:34.330 回答
0

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

于 2014-08-27T11:36:32.747 回答