【问题标题】:How to save assembly to disk?如何将程序集保存到磁盘?
【发布时间】:2012-06-26 04:20:02
【问题描述】:

如何将程序集保存到文件中? IE。我的意思不是动态程序集,而是“正常”的内存程序集。

Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ass1 in asslist)
{
    // How to save?
}

当应用程序从资源中加载一些引用的程序集时,可能会发生这种情况。我想将它们保存到磁盘。

不可能从资源中提取程序集,因为它们在那里被加密。

【问题讨论】:

  • +1,如果只是为了使用“assList”。
  • 这没有任何意义。也不可能。当然,从资源中读取程序集并使用 File.WriteAllBytes() 保存它要简单得多。或者一开始就不把它放在资源中。
  • 为什么要将 ass[...]es 保存到磁盘?那是他们被装载的地方。难道你不能只弄清楚路径然后复制它们吗?
  • 如果你想从资源中提取组件,使用类似 reshack 的东西
  • 2 stackx:因为我想分析这些程序集中的一些函数。他们正在使用解密加载事件 fmor 资源。

标签: .net save .net-assembly disk


【解决方案1】:

尝试序列化程序集怎么样?它是serializable

【讨论】:

    【解决方案2】:

    根据 Greg Ros 的想法,我开发了这个小 sn-p。 请注意,我试图坚持命名约定。

    public void SaveAllAssemblies()
    {   
        Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies();
        foreach (Assembly ass in asslist)
        {
            FileInfo fi = new FileInfo(ass.Location);
    
            if (!fi.Extension.Equals(".exe", StringComparison.InvariantCultureIgnoreCase))
            {
                var assName = fi.Name;
                var assConverter = new FormatterConverter(); 
                var assInfo = new SerializationInfo(typeof(Assembly), assConverter);
                var assContext = new StreamingContext();
    
                using (var assStream = new FileStream(assName, FileMode.Create))
                {
                    BinaryFormatter bformatter = new BinaryFormatter();
                    ass.GetObjectData(assInfo, assContext);
    
                    bformatter.Serialize(assStream, assInfo);
                    assStream.Close();
                }
            }
        }
    }   
    

    但有些程序集没有标记为可序列化,例如 mscorlib.dll。 因此,这可能只是部分解决方案?

    尽管可以序列化 some 程序集,但我建议使用 示例中提供的 FileInfo,生成一个列表并检查 original 程序集。

    【讨论】:

    • 我在我的测试应用程序(exe 和我的程序集)中尝试了这种方式。我试图序列化我的程序集。错误出现在 bformatter.Serialize() 调用上:[System.Runtime.Serialization.SerializationException] = {"Type 'System.Runtime.Serialization.SerializationInfo' in Assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089' 未标记为可序列化。"}
    【解决方案3】:

    您需要找到您的程序集来自的路径。你可以这样找到它:

    Assembly ass = ...;
    return ass.Location;
    

    注意,as 是关键字,不能用作标识符。我推荐使用ass

    【讨论】:

    • 我找不到路径,因为这些程序集已加密并且在资源中。应用程序在“解决事件”上加载它们。属性“位置”不可读,因为包含不可打印的字符
    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多