【问题标题】:How to save a dynamically generated assembly that is stored in-memory?如何保存存储在内存中的动态生成的程序集?
【发布时间】:2009-12-09 08:56:38
【问题描述】:

我想通过将程序集保存到光盘或在运行时反映它来掌握程序集。程序集由第三方在内存中动态生成。

有人知道怎么做吗?

【问题讨论】:

    标签: c# dynamic-assemblies


    【解决方案1】:

    试试这个(找到here):

    byte[] dllAsArray;
    
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
    
        formatter.Serialize(stream, results.CompiledAssembly);
    
        dllAsArray = stream.ToArray();
    }
    

    【讨论】:

    • 这是真的。您还可以通过 Internet 发送它们(例如通过 WCF),将其转换回另一端的程序集并加载它。让我大吃一惊。
    • 相反,您可以在编译时存储在临时文件夹中的文件上使用 File.ReadAllBytes。
    • 谨慎接受远程发送的程序集。这很快就会成为一个重大的安全问题。
    • 我知道距离上一篇文章已经有一段时间了,但我不想再提出另一个问题。 “结果”从何而来——我很难找出一个支持名为“CompiledAssembly”的字段/属性的类?
    • (您现在可能已经找到了,但是...) CSharpCodeProvider.CompileAssemblyFromSource 生成一个具有 CompiledAssembly 的 CompilerResults 对象。 CSharpCodeProvider 还具有 CompilerParameters 属性,该属性具有 GenerateInMemory/OutputAssembly 属性以编译到内存或磁盘。我注意到使用上面的 BinaryFormatter 选项(在我的特定示例中)只会生成一个 175 字节大小的文件,但编译到磁盘会创建一个 9K 文件。 9k 一个加载而 175 字节一个不加载,所以我不建议使用 BinaryFormatter 来创建程序集。
    【解决方案2】:

    我已经有一段时间没有这样做了,我猜将 DLL 交给你的程序使用了CompilerParameters.GenerateInMemory=True。

    然而,事实上,dll 确实会在磁盘上的某个临时文件夹中保存一小段时间(当它运行时或其他东西时......),因为这就是 C# 编译器的工作方式(工作?)。

    我记得当时这对我来说是个问题,但现在我无法找回详细信息,请稍等。您可以使用 ProcessExplorer 或类似工具可能会发现这一点,以查看哪些文件被保存/触摸。

    【讨论】:

      【解决方案3】:

      您可以在 WinDbg 中使用 SOS 来做到这一点。

      问题在于找到模块。

      如果您确实掌握了它,可以使用“SaveModule”命令将模块/程序集转储到文件中。

      祝你好运:)

      【讨论】:

      • 好吧,说到再试一次,你不能 SaveModule 一个仅限«运行»的模块:)
      • @JB:这是来自 WinDbg,我不知道有这样的限制。
      • 这就是我的意思。用 !DumpDomain 可以看到模块,但是用 !SaveModule 不能看到。
      • 您不知道限制的事实并没有使限制变得不那么真实。动态创建的程序集没有可以与 windbg 中加载的任何 PE 模块进行交互的模块。它们没有您可以使用的基地址,也无法转储它们。
      • 您仍然可以调试动态程序集(尽管您丢失了一些细节和可能性 iirc)。只是动态模块不是 MSdbg 可以转储的 PE 形状,直到它们真正保存到磁盘。它们在 CLR 中有自己的自定义表示。
      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多