Рассматривали ли вы аргументы командной строки? Запустите программу из Visual Studio с флагом --no-exception-processing (или любым другим подходящим звуком) и не обрабатывайте исключения, если этот аргумент передается. Когда вы запустите программу в другом месте, без этого аргумента, она будет вести себя нормально.
Мы используем отчеты Crystal в нескольких различных приложениях / веб-страницах. Ни в одном из них мы фактически не включаем сами файлы отчетов в проект Visual Studio. Мы помещаем файлы во что-то вроде подкаталога / Reports, а затем ссылаемся на них по имени файла. Мы все еще используем довольно старую версию Crystal, но я бы не подумал, что они откажутся от чего-то подобного.
Мы используем примерно такой код:
Dim myRpt As New ReportDocument
Select Case strFormNum
Case "M5044b"
strReportPath = Server.MapPath("/Reports/M5044b.rpt")
<..Snip a lot of case statements...>
Case "M5238aWithAI"
strReportPath = Server.MapPath("/Reports/M5238a_WithAI.rpt")
End Select
myRpt.Load(strReportPath)
myRpt.SetDatabaseLogon(strCRUser, strCRPassword, strCRServer, strCRDB)
myRpt.SetParameterValue("@nIndex", intNewIndex)
myRpt.DataDefinition.FormulaFields.Item("Version").Text = "'Report Printed: " & Now().ToString & "'"
oStream = myRpt.ExportToStream(ExportFormatType.PortableDocFormat)
Необходимо убедиться, что настраиваемый инструмент не запускается для каждого отчета. По умолчанию, когда вы добавляете кристаллический отчет в проект, он связывает этот настраиваемый инструмент, который генерирует класс оболочки для отчета. Гораздо быстрее ссылаться на отчет по имени файла (как демонстрирует Джош В.) и хранить отчеты вне сборки.