观察以下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也可以完成这项工作)。
提前感谢所有优秀的撒玛利亚人。
答案 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框架中没有内置方法可以做到这一点。您可以尝试查看类似Cecil或Microsoft's Common Compiler Infrastructure - Metadata项目的内容,尝试在SL中运行这些项目。这样做肯定需要重新编译,我不确定任何依赖。除此之外,您将继续实现自己的代码来解析汇编字节。这样做不适合胆小的人,并且需要在我提到的2个项目中重复使用源代码。