Между прочим, причина этого странного поведения заключается в том, что команда безопасности CLR изменила верификатор непосредственно перед отправкой v2, так что стало невозможно проверить не виртуальный вызов виртуального метода одного класса из метода в другом класс.
Для дальнейшего объяснения этой проблемы см. Мою статью на эту тему несколько лет назад.
Это сейчас устарело; мы исправили компилятор, чтобы он теперь генерировал для вас помощник.
The internet also suggests reinstalling the crystal report runtimes on the machines you are trying to open the report on (making sure that all locations have the same version).
Если ваше приложение является автономным исполняемым файлом, то эта ошибка возникает из-за того, что вы неправильно закрываете объект отчета, когда закончили с тем, что вы делаете. Вы можете увидеть эту ошибку в своем приложении как приложении ASP.NET с большим количеством пользователей, одновременно обращающихся к вашему сайту.
Вы можете привести к тому, что ошибка появится раньше, настроив этот раздел реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\CRYSTAL DECISIONS\10.0\REPORT APPLICATION SERVER\SERVER\PrintJobLimit
Обычно это значение по умолчанию 75. Для отладки вы можете установить меньшее значение и вызвать более быстрое появление ошибки.
Когда вы выполняются с использованием объекта отчета, вызовите метод .Close (), который очистит используемые неуправляемые ресурсы.
Есть те, которые упоминают об изменении настройки на -1. Это ошибка, это вызовет другие проблемы только для долго работающего приложения. В конечном итоге у процесса закончатся ресурсы и начнется сбой, который будет еще труднее устранить.
К вашему сведению, я только что проверил это решение для аналогичной проблемы. Метод ReportDocument.Load не срабатывал при использовании сопоставленного сетевого ресурса или UNC-пути, а установка crystal reports VS runtime на файловый сервер устранила проблему.
Я убедился, что решение Джона Дайера, приведенное выше, работает не во всех случаях.
Я также убедился, что переустановка Crystal Runtime не помогла при этой конкретной ошибке.
Для моего приложения это происходило только при установке на Citrix автономного .exe с встроенными отчетами. Прежде чем использовать Crystal Report Viewer, мне нужно убедиться, что я очистил все отчеты, ранее загруженные в программу просмотра, в соответствии с инструкциями Джона. Итак, я написал нечто (на VB), что выглядит так
Public Function ShowRpt(...) As Boolean
....
CleanOutViewer()
....
End Function
где CleanOutViewer:
Private Sub CleanOutViewer()
If Not Me.CrystalReportViewer1.ReportSource() Is Nothing Then
CType(Me.CrystalReportViewer1.ReportSource(), CrystalDecisions.CrystalReports.Engine.ReportDocument).Close()
CType(Me.CrystalReportViewer1.ReportSource(), CrystalDecisions.CrystalReports.Engine.ReportDocument).Dispose()
Me.CrystalReportViewer1.ReportSource() = Nothing
GC.Collect()
End If
End Sub
Вызовы после .Close() также не дали никакого эффекта (и были добавлены в качестве альтернативной попытки заставить Crystal освободить ресурсы).