从xap内部的所有dll中提取程序集

时间:2010-09-27 04:12:13

标签: silverlight-4.0 c#-4.0

我有silverlight XAP的字节数组。我需要从字节数组中提取xap中的所有dll。一旦我得到dll,我需要从它中提取程序集.Silverlight XAP存储在存储库中,存储库总是返回我的XAP字节数组.C#中是否有任何标准API可用于实现此功能?如果不是,我们如何实现这个?

的问候,阿布舍克巴克

2 个答案:

答案 0 :(得分:3)

从字节数组中创建一个MemoryStream并调用此函数:

public List<Assembly> ExtractAssembliesFromXap(Stream stream) {
        List<Assembly> assemblies = new List<Assembly>();

        string appManifest = new StreamReader(Application.GetResourceStream(
            new StreamResourceInfo(stream, null), new Uri("AppManifest.xaml",
                                       UriKind.Relative)).Stream).ReadToEnd();

        XElement deploy = XDocument.Parse(appManifest).Root;

        List<XElement> parts = (from assemblyParts in deploy.Elements().Elements()
                                select assemblyParts).ToList();

        foreach (XElement xe in parts) {
            string source = xe.Attribute("Source").Value;
            AssemblyPart asmPart = new AssemblyPart();
            StreamResourceInfo streamInfo = Application.GetResourceStream(
                 new StreamResourceInfo(stream, "application/binary"),
                 new Uri(source, UriKind.Relative));

            assemblies.Add(asmPart.Load(streamInfo.Stream));
        }
        return assemblies;
    }

答案 1 :(得分:1)

没有可用的标准API,但它应该不难做到。 XAP文件只是一个具有不同扩展名的ZIP文件。使用像DotNetZip或SharpZipLib这样的库来获取其内容(这些库可以接受流或字节数组,因此您应该能够将XAP字节数组直接传递到它们中以提取文件)。通过获取DLL并从中提取程序集,我不确定你的意思 - 你从XAP文件中提取的DLL是程序集。

希望这会有所帮助......

克里斯