【问题标题】:Debug dynamically loaded assembly调试动态加载的程序集
【发布时间】:2011-10-20 13:34:13
【问题描述】:

我正在调试一个使用Assembly.Load(Byte[]) 动态加载的程序集,但我遇到了一些问题。

首先,我无法移动 Visual Studio 2010 中的黄色箭头以进入其他代码行,并且在尝试执行此操作时出现异常(“找不到对象实例上的方法。”)快速查看来自第三方库的对象(例如来自 Infragistics 的控件。)

Dim data = My.Computer.FileSystem.ReadAllBytes(file.FullName)
Assembly.Load(data)

使用Assembly.Load(String)时,一切正常,没有问题。

Assembly.Load(IO.Path.GetFileNameWithoutExtension(file.Name))

知道为什么行为如此不同吗?无论如何要解决这个问题?

我尝试使用 Assembly.Load(byte[].byte[]) 为我的程序集加载调试符号,但尝试从第三方库调试对象时仍然出现异常。

【问题讨论】:

    标签: .net vb.net dynamic assemblies


    【解决方案1】:

    您的程序集的调试符号未加载到应用程序域中。当您使用字符串变体时,.NET 会自动在您指定的文件名旁边查找 .PDB。

    要从字节数组中加载程序集和其符号,请使用Assembly.Load(byte[], byte[]),如下所示:

    Dim data = My.Computer.FileSystem.ReadAllBytes(file.FullName)
    Dim pdbData = My.Computer.FileSystem.ReadAllBytes(pdbFile.FullName)
    Assembly.Load(data, pdbData)
    

    【讨论】:

    • 我试过这个,符号被加载了,但我仍然有来自这个程序集依赖项的类/对象的问题。
    • 您还必须手动加载依赖项。订阅AssemblyResolve 事件可能对您的情况有所帮助。
    【解决方案2】:

    当您向它传递一个字节数组时,无法知道它来自哪个文件(或者它是否来自文件),因此它无法使用源代码行信息找到 PDB 文件。

    您可以通过将 byte[] 保存为文件并确保有一个具有相同文件名的 PDB 来解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-12
      • 2023-03-09
      • 2020-03-07
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多