Перенаправление сборки из GAC с другой второстепенной версией

#c# #.net #reporting-services #.net-assembly

#c# #.net #службы отчетов #.net-сборка

Вопрос:

У нас есть проект создания отчетов, использующий клиентскую версию SSRS, файлы RDLC. Для этого мы используем Nuget-пакет «Microsoft.ReportViewer.Windows» с единственной доступной версией. Версия файла — «11.0.3452.0». Все работает нормально, но на ОДНОМ сервере, когда мы устанавливаем «Microsoft Report Viewer 2012 Runtime CTP» в GAC, версия файла «11.0.1443.3», используются эти сборки, а вложенные отчеты отображают сообщение

Ошибка: не удалось отобразить вложенный отчет.

Из того, что я понял, ожидаемое поведение заключается в том, что сборки gac с одной и той же основной версией приоритетнее локальных.

Теперь интересная часть: я вставил несколько отладок, чтобы распечатать все загруженные сборки:

 protected void BtnAssemblies_Click(object sender, EventArgs e)
{
    var sb = new StringBuilder();
    sb.Append("<br />");

    var sbExceptions = new StringBuilder();
    sbExceptions.Append("<br />");

    var t = new LocalReport();

    var reportViewerAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
    for(int i = 0; i < reportViewerAssemblies.Count();i   )
    {
        var ass = reportViewerAssemblies[i];

        try
        {
            sb.Append(ass.FullName);
            sb.Append(": ");
            sb.Append(ass.CodeBase);
            sb.Append("<br />");
        }
        catch(Exception ex)
        {
            sbExceptions.Append(ass.FullName);
            sbExceptions.Append("<br />");
        }
    }

    var str = sb.ToString();
    str  = "<br />";
    str  = "<br />";

    str  = sbExceptions.ToString();
    LblAssemblies.Text = str;
}
  

И за исключением 4 ожидаемых сборок:

  • Microsoft.ReportViewer.Common.DLL
  • Microsoft.ReportViewer.DataVisualization.DLL
  • Microsoft.ReportViewer.ProcessingObjectModel.DLL
  • Microsoft.ReportViewer.WinForms.DLL

Загруженные сборки точно такие же. Поскольку я понятия не имею, как это может произойти, я попытался «исправить» проблему, перезаписав привязку, поскольку я все равно хотел бы использовать локальные сборки. Поскольку невозможно перенаправить ту же версию, я попробовал файловую версию:

 <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.ReportViewer.Common.dll" publicKeyToken="89845dcd8080cc91" culture="neutral" />
    <bindingRedirect oldVersion="11.0.1443.3" newVersion="11.0.3452.0" />
  </dependentAssembly>
</assemblyBinding>
</runtime>
  

Что также не работает.
Итак, мои вопросы:

  • Как возможно, что установка другой второстепенной версии в GAC приводит к сбою ОДНОГО сервера?
  • Есть ли какой-нибудь способ узнать больше о загруженных сборках? К сожалению, мы не получаем ошибку напрямую, просто бессмысленное сообщение
  • В качестве обходного пути есть ли какая-либо возможность либо отменить GAC, либо перенаправить файл-versiob