【问题标题】:Is it possible in Silverlight to read assembly manifest without loading the full assembly?在 Silverlight 中是否可以在不加载完整程序集的情况下读取程序集清单?
【发布时间】:2010-01-12 13:59:36
【问题描述】:

观察以下 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 也可以完成这项工作)。

在此先感谢所有好心人。

【问题讨论】:

    标签: silverlight assemblies


    【解决方案1】:

    您可以在任何 .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] 以实现您的需要。

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

    【讨论】:

    • 只有一个小问题——Silverlight平台没有Assembly.ReflectionOnlyLoad方法。
    • 没错,它在System.Reflection 命名空间中。 Silverlight 是基于 .NET 平台构建的。
    • @Paulo,您是否尝试在 Silverlight 类库中编译您的代码?请尝试,如果您没有,然后相应地更改您的回复。
    • 我不知道如何利用这个 hack,因为我的代码真正在浏览器中运行,所以它无法加载非 silverlight 程序集,可以吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多