如何将程序集保存到磁盘?

时间:2012-06-24 19:07:15

标签: .net save .net-assembly disk

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要找到ass[...]es来自的路径。你可以这样找到它:

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

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

答案 2 :(得分: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,生成列表并检查原始 组件。