如何将装配保存到磁盘?

6

如何将程序集保存到文件中?我的意思是不是动态加载的程序集,而是普通的内存中的程序集。

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

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

从资源中提取程序集是不可能的,因为它们被加密了。


15
如只为使用"assList",请点赞(+1)。 - Iridium
2
这毫无意义。也不可能实现。当然,更简单的方法是从资源中读取汇编代码并使用File.WriteAllBytes()保存它。或者干脆一开始就不要将其放入资源中。 - Hans Passant
3
为什么要把“屁股”存到硬盘上?它们不是已经从那里加载了吗?你不能只找出路径然后复制它们吗? - stakx - no longer contributing
如果您想从资源中提取程序集,请使用类似于Reshack的工具。 - Jim Deville
2 stackx:因为我想分析这些程序集中的一些函数。它们是通过解密从资源加载的事件。 - ZedZip
3个回答

0

从Greg Ros的想法中,我开发了这个小片段。 请注意,我尝试遵循命名约定。

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。因此,这可能只是部分解决方案?

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


我在我的测试应用程序(exe和我的程序集)中尝试了这种方法。我试图序列化我的程序集。错误出现在bformatter.Serialize()调用上:[System.Runtime.Serialization.SerializationException] = {"程序集mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089中的类型'System.Runtime.Serialization.SerializationInfo'未标记为可序列化。"} - ZedZip

0

0
你需要找到程序集来自的路径。你可以这样找到它:
Assembly ass = ...;
return ass.Location;

请注意,as是一个关键字,不能用作标识符。我建议使用ass

我无法找到路径,因为这些程序集是加密的并且在资源中。应用程序在“解析事件”上加载它们。属性“位置”不可读,因为包含不可打印的字符。 - ZedZip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接