2010-01-12 44 views
1

观察下面这段代码的Silverlight: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

正如你可以在任何.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.0.0]更换参考mscorlib [2.0.5.0]达到你所需要的。

但是,如果你为了做到这一点创建一个分开组装的,因为更换引用可能搞砸了你的代码的其他部分它会更好。

+0

只有一个小问题 - Silverlight平台没有Assembly.ReflectionOnlyLoad方法。 – mark 2010-01-12 14:19:45

+0

确实,它位于'System.Reflection'命名空间中。 Silverlight是建立在.NET平台之上的。 – 2010-01-12 14:32:55

+0

@Paulo,你有没有试过在Silverlight类库中编译你的代码?请尝试,如果你没有,然后相应地改变你的答复。 – mark 2010-01-12 14:40:11

0

没有内置的方式做到这一点在Silverlight框架。您可以尝试查看诸如CecilMicrosoft's Common Compiler Infrastructure - Metadata项目以尝试在SL中运行这些项目。这样做肯定需要重新编译,而且我不确定任何依赖关系。除此之外,你将剩下实现你自己的代码来解析汇编字节。这样做并不是因为内心的淡漠,而是需要我提到的两个项目的重要来源重复。

相关问题