C# 如何调试通过assembly.Load(字节[])加载的程序集?

C# 如何调试通过assembly.Load(字节[])加载的程序集?,c#,.net,visual-studio,visual-studio-2008,C#,.net,Visual Studio,Visual Studio 2008,我正在为使用Assembly.Load(byte[])加载插件DLL的产品创建插件。这一切都很好,但这意味着我没有加载调试符号以逐步完成代码的常规方法 疯狂的是,几个月前,我遇到了完全相同的问题并解决了它——我为自己感到骄傲!所以我知道这是可以做到的,我只是忘了怎么做 对于我可能尝试过的事情,我有一些模糊的记忆,但我无法从脑海中挑出细节: .NET反射器 但可能是错的,因为我清楚地记得我浏览了原始的.cs文件 使用IIS Express而不是Cassini 但这让我觉得是一个奇怪的解决方

我正在为使用
Assembly.Load(byte[])
加载插件DLL的产品创建插件。这一切都很好,但这意味着我没有加载调试符号以逐步完成代码的常规方法

疯狂的是,几个月前,我遇到了完全相同的问题并解决了它——我为自己感到骄傲!所以我知道这是可以做到的,我只是忘了怎么做

对于我可能尝试过的事情,我有一些模糊的记忆,但我无法从脑海中挑出细节:

  • .NET反射器
    • 但可能是错的,因为我清楚地记得我浏览了原始的.cs文件
  • 使用IIS Express而不是Cassini
    • 但这让我觉得是一个奇怪的解决方案——程序集是从字节数组加载的,因此框架不知道DLL来自何处,也不知道适当的PDB在看到DLL时会是什么样子。这个问题应该存在于任何环境中
  • 通过“模块”窗口手动加载符号
    • 试过这个,;我得到“符号文件xxxxx.pdb与模块不匹配”-因为,当然,我们是从字节数组加载的,而不是DLL本身

如果程序集具有强名称,则可以将程序集放入GAC中。强名称程序集总是从GAC加载,即使它是通过
Assembly.Load(byte[])
加载的。然后把你的符号放在
C:\Windows\symbols\dll
或任何方便的地方。我一直这样做是为了调试我们自己产品的插件DLL,这些DLL由另一个应用程序以类似的方式加载


您可以使用
gacutil
将其安装到GAC中。请记住在完成调试时删除它,否则您可能会对您忘记的旧版本运行测试。

您可能使用了Load(byte[],byte[])重载。我希望能够做到这一点,但该产品是封闭源代码的。我知道Assemly.Load(byte[])正在使用,因为我使用了Reflector。我可以要求他们使用
byte[],byte[]
并检查.pdb文件,但我必须等待谁知道下一个版本需要多长时间(假设它得到批准)。谢谢:)你的程序集是强命名的吗?强命名听起来是一个很好的解决方案,我以后可能会研究。很难做到吗?与此同时,我做了一些乱七八糟的事情,但效果不错。该框架只动态调用一个方法(这是我需要调试的部分),因此我只是将动态实例化的类作为“real”类的包装器,该类执行leg工作。我通过Assembly.load(byte[],byte[])和hey presto加载“real”类。当我用完它的时候,我就把它打开。肮脏,但它可以工作。@IainFraser强命名很容易。您可以使用强名称工具(sn.exe)生成密钥文件。然后,在项目属性“签名”部分,您可以告诉生成使用密钥文件对程序集进行签名。看见