Ответ 1
Что-то вроде этого должно это сделать:
Assembly assembly = Assembly.LoadFrom("Reports.dll");
Stream stream = assembly.GetManifestResourceStream("Reports.MyReport.rdlc");
reportViewer.LocalReport.LoadReportDefinition(stream);
У меня есть отчет, который используется службой Windows и приложением формы. Итак, я хочу поместить вложенный отчет в DLL файл, который может использоваться обоими.
Проблема заключается в том, что если я попытаюсь установить свойство ReportEmbeddedResource элемента управления ReportViewer в моем приложении формы Windows, он будет искать приложение формы Windows для ресурса, а не файл dll.
Например: Код из окна формы приложения:
rv.LocalReport.ReportEmbeddedResource = "MyReportInMyDLLFile.rdlc"
Как я могу заставить вышеуказанную команду искать встроенный ресурс в моем DLL файле?
Что-то вроде этого должно это сделать:
Assembly assembly = Assembly.LoadFrom("Reports.dll");
Stream stream = assembly.GetManifestResourceStream("Reports.MyReport.rdlc");
reportViewer.LocalReport.LoadReportDefinition(stream);
Просто используйте полное пространство имен сборки, затем имена папок, а затем имя файла:
rv.LocalReport.ReportEmbeddedResource =
"My.Assembly.Namespace.Folder1.Folder2.MyReport.rdlc";
Затем убедитесь, что файл отчета установлен как встроенный ресурс, используя панель свойств.
Вероятно, лучше всего было бы получить поток к ресурсу RDLC из другой сборки, а затем передать это методу "LoadReportDefinition" элемента управления Report Viewer.
Сведения о том, как получить поток из встроенного ресурса в другой сборке, можно найти здесь: Извлечение ресурсов с помощью класса ResourceManager
Кроме того, вам нужно будет обратиться к встроенному ресурсу, используя полный путь пространства имен.
например. если у вас есть приложение с пространством имен по умолчанию TheApp, и вы сохраняете отчет под названием " MyReport.rdlc" в папке с именем " Отчеты", запрос ссылки отчета будет: -
rv.LocalReport.ReportEmbeddedResource = "TheApp.Reports.MyReport.rdlc";