是否可以在Silverlight中读取程序集清单而不加载完整程序集?

时间:2010-01-12 13:59:36

标签: silverlight assemblies

观察以下Silverlight代码:

foreach (AssemblyPart ap in Deployment.Current.Parts)
{
  var sri = Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative));
  var assembly = new AssemblyPart().Load(sri.Stream);
  // Do something with the assembly.
}

它迭代应用程序可用的所有程序集并对它们执行某些操作。这段代码的问题在于即使只是读取程序集清单,代码也会将完整的程序集加载到进程空间中。

是否有可能以某种方式对其进行优化?

我有类似的.NET代码,它使用PostSharp.Core库来读取程序集清单,而不加载完整的程序集(Mono.Cecil也可以完成这项工作)。

提前感谢所有优秀的撒玛利亚人。

2 个答案:

答案 0 :(得分:0)

正如您在任何.NET代码中所做的那样:

foreach (AssemblyPart ap in Deployment.Current.Parts)
{
    byte[] buffer = new byte[1024];
    List<byte> assemblyBytes = new List<byte>();

    using (var sri = Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative)).Stream)
    {
        int read = -1;
        do
        {
            read = sri.Read(buffer, 0, buffer.Length);
            if (read != -1)
            {
                Array.Resize(ref buffer, read);
                assemblyBytes.AddRange(buffer);
            }
        }
        while (read != -1);
    }

    var assembly = Assembly.ReflectionOnlyLoad(assemblyBytes.ToArray());
    // Do something with the assembly.     
}

已编辑添加

这里的诀窍是用mscorlib [2.0.5.0]替换mscorlib [2.0.0.0]的引用,以达到您的需要。

但是,如果为了执行此操作而创建一个单独的程序集会更好,因为替换引用可能会搞砸代码的其他部分。

答案 1 :(得分:0)

在silverlight框架中没有内置方法可以做到这一点。您可以尝试查看类似CecilMicrosoft's Common Compiler Infrastructure - Metadata项目的内容,尝试在SL中运行这些项目。这样做肯定需要重新编译,我不确定任何依赖。除此之外,您将继续实现自己的代码来解析汇编字节。这样做不适合胆小的人,并且需要在我提到的2个项目中重复使用源代码。