Возможно ли в Silverlight прочитать сборочный манифест без загрузки полной сборки? - PullRequest
1 голос
/ 12 января 2010

Обратите внимание на следующий фрагмент кода 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.
}

Он перебирает все сборки, доступные приложению, и что-то с ними делает.Проблема с этим кодом заключается в том, что даже если это что-то просто читает манифест сборки, код загружает все сборки в пространство процесса.

Возможно ли как-то его оптимизировать?

Iиметь аналогичный код .NET, который использует библиотеку PostSharp.Core для простого чтения манифестов сборки, без загрузки полных сборок (Mono.Cecil также выполняет свою работу).

Заранее благодарим всех добрых самаритян изесть.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2010

Нет встроенного способа сделать это в платформе silverlight. Вы можете попробовать что-то вроде Cecil или Общая инфраструктура компилятора Microsoft - метаданные , чтобы попытаться запустить их в SL. Для этого, безусловно, потребуется перекомпиляция, и я не уверен в каких-либо зависимостях. Если не считать этого, у вас останется реализация собственного кода, который будет анализировать ассемблерные байты. Это не для слабонервных и потребует значительного дублирования исходного кода с двумя проектами, о которых я упоминаю.

0 голосов
/ 12 января 2010

Как вы можете сделать в любом коде .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] для достижения того, что вам нужно.

Однако для этого было бы лучше создать отдельную сборку, поскольку замена ссылки может испортить другие части вашего кода.

...