Страница 1 из 1

GetReportFromAssembly

Добавлено: 12 мар 2008, 08:31
TVV
Здравствуйте

Вопрос по загрузке отчётов из сборки

По определённым причинам я не хотел бы связываться с файлами

if(!File.Exists ...
и т.д.

Хотелось создать сборку
Положить её в некий кєш
и далее многократно делать StiReport.GetReportFromAssembly(asm)

я думал сделать так :

report.Compile();
asm = report.CompilerResults.CompiledAssembly;

однако, увидел, что CompiledAssembly == null

ну, вот, собственно, и вопрос :
как скомпилировать отчёт(не в файл!) и получить сборку и далее использовать только её

временно(?) сделал так

MemoryStream strm = new MemoryStream();

report.Compile(strm);

report.CompilerResults.CompiledAssembly

byte[] asmDump = strm.ToArray();

m_Assemblies.Add(
templateHashKey, Assembly.Load(asmDump));

Но мне кажется, ято так я загружаю 2 одинаковые сборки
1, "неявно", при report.Compile
2, "явно", вызывая Assembly.Load(asmDump)

Спасибо.


GetReportFromAssembly

Добавлено: 12 мар 2008, 13:23
Vital
Вопрос по загрузке отчётов из сборки

По определённым причинам я не хотел бы связываться с файлами

if(!File.Exists ...
и т.д.

Хотелось создать сборку
Положить её в некий кєш
и далее многократно делать StiReport.GetReportFromAssembly(asm)

я думал сделать так :

report.Compile();
asm = report.CompilerResults.CompiledAssembly;

однако, увидел, что CompiledAssembly == null
Это свойство очищается после компиляции. Сборку мможно достать так:

Код: Выделить всё

Assembly assembly = report.CompiledReport.getType().Assembly;
ну, вот, собственно, и вопрос :
как скомпилировать отчёт(не в файл!) и получить сборку и далее использовать только её

временно(?) сделал так

MemoryStream strm = new MemoryStream();

report.Compile(strm);

report.CompilerResults.CompiledAssembly

byte[] asmDump = strm.ToArray();

m_Assemblies.Add(
templateHashKey, Assembly.Load(asmDump));

Но мне кажется, ято так я загружаю 2 одинаковые сборки
1, "неявно", при report.Compile
2, "явно", вызывая Assembly.Load(asmDump)
Этот код загружает сборку только один раз, но если вызвать его много раз то сборка будет загружена много раз. Единственной гарантией загрузки сборки один раз является
загрузка сборки из файла.

p.s. Может стоит включить отчеты в проект как исходный код?

Спасибо.

GetReportFromAssembly

Добавлено: 13 мар 2008, 13:00
TVV
Спасибо за ответ
но если вызвать его много раз
нет, естественно я кеширую сборки (...m_Assemblies.Add(templateHashKey, Assembly.Load(asmDump));) для процесса
а для потока кэширую созданные из сборок отчёты
сборка загружается один раз для одного процесса
p.s. Может стоит включить отчеты в проект как исходный код?
никак нельзя, другая архитектура, щаблоны лежат в БД :)
а с файлами много проблем, когда их очень много и когда их нужно совместно использовать несколькими процессами :)
Assembly assembly = report.CompiledReport.getType().Assembly;
это мне подходит
ещё раз, спасибо!