Выгрузка домена с отчетом

Обсуждение Stimulsoft Reports.NET
Ответить
res562
Сообщения: 28
Зарегистрирован: 26 июл 2010, 13:59

Выгрузка домена с отчетом

Сообщение res562 »

Когда выгружаю домен вместе с отчетом, то закрывается все приложение.
Как правильно его выгрузить?
В wpf версии домен выгружается нормально, приложение не закрывается, само приложение на wpf.
Вот код:

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

        private void ExecuteEditReportCommand()
        {
            if (appDomain == null)
            {
                AppDomainSetup appDomainSetup = new AppDomainSetup();
                appDomainSetup.ShadowCopyFiles = "false";
                appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
                appDomain = AppDomain.CreateDomain("ReportDomain", null, appDomainSetup);

            }
            countDomainUse++;


            worker wrk =
                                appDomain.CreateInstanceAndUnwrap(Assembly.GetEntryAssembly().FullName, typeof(worker).FullName) as
                                worker;
            wrk.print();
            if (countDomainUse > 3)
            {
                AppDomain.Unload(appDomain);
                appDomain = null;
                countDomainUse = 0;
            }
            GC.Collect();


        }

    public class worker : MarshalByRefObject
    {
        public void print()
        {
            StiReport report=new Report();
            report.RegData("ReportData",someData)
            report.DesignWithWpf();
        }
 
    }
После трех выполнений метода и закрытия дизайнера приложение тоже закрывается.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Выгрузка домена с отчетом

Сообщение Jan »

Здравствуйте,

Мы использовали такие методы для запуска отчета в другом домене:

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

internal AppDomain reportDomain = null;

		public StiReport CreateReportInNewAppDomain()
		{
			AppDomainSetup appDomainSetup = new AppDomainSetup();
			appDomainSetup.ShadowCopyFiles = "false";
			appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
			AppDomain appDomain = AppDomain.CreateDomain(StiGuidUtils.NewGuid(), AppDomain.CurrentDomain.Evidence, appDomainSetup);
			
			StiReport report = appDomain.CreateInstanceAndUnwrap(this.GetType().Assembly.FullName, this.GetType().FullName)
				as StiReport;

			reportDomain = appDomain;

			report.LoadFromString(this.SaveToString());
            
			foreach (StiData data in this.DataStore)
			{
				report.RegData(data.Name, data.Data);
				report.DataStore[report.DataStore.Count - 1].ViewData = data.ViewData;
			}

			return report;
		}


		public void UnloadReportAppDomain()
		{
			if (reportDomain != null)
			{
				AppDomain.Unload(reportDomain);
				reportDomain = null;
			}
		}
Спасибо.
res562
Сообщения: 28
Зарегистрирован: 26 июл 2010, 13:59

Выгрузка домена с отчетом

Сообщение res562 »

Не понятно чем ваш код принципиально отличается от моего.
Обнаружил, что проблемы возникают только когда в новом домене открывается дизайнер отчетов. Если не открывать дизайнер или просто просматривать отчет то домен нормально выгружается, если же открыть дизаенер через report.Design() или создать эземпляр StiDesignerControl, то при выгрузке домена, где был открыт дизайнер, закрывается все приложение.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Выгрузка домена с отчетом

Сообщение Jan »

Здравствуйте,

Сложно что-то сказать. Вы не могли бы прислать пример приложения и описание шагов для воспроизведения проблемы на support@stimulsoft.com?

Спасибо.
res562
Сообщения: 28
Зарегистрирован: 26 июл 2010, 13:59

Выгрузка домена с отчетом

Сообщение res562 »

Вот обработчик события нажатия на кнопку в wpf:
private void Button_Click(object sender, RoutedEventArgs e)
{
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ShadowCopyFiles = "false";
appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
AppDomain reportDomain = AppDomain.CreateDomain("ReportDomain", null, appDomainSetup);
DinamicReport report = reportDomain.CreateInstanceAndUnwrap(typeof(DinamicReport).Assembly.FullName, typeof(DinamicReport).FullName) as DinamicReport;
report.Design();
AppDomain.Unload(reportDomain);
reportDomain = null;
}

public class DinamicReport : MarshalByRefObject
{
public void Design()
{
StiReport report = new StiReport();
report.Design();
}
}

После нажатия на кнопку открывается дизайнер. При закрытии дизайнера и наведении курсора на окно wpf оно сразу закрывается.
res562
Сообщения: 28
Зарегистрирован: 26 июл 2010, 13:59

Выгрузка домена с отчетом

Сообщение res562 »

Решил проблему открытием дизайнера в новом потоке:

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

private void Button_Click(object sender, RoutedEventArgs e)
{
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ShadowCopyFiles = "false";
appDomainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
AppDomain reportDomain = AppDomain.CreateDomain("ReportDomain", null, appDomainSetup);
DinamicReport report = reportDomain.CreateInstanceAndUnwrap(typeof(DinamicReport).Assembly.FullName, typeof(DinamicReport).FullName) as DinamicReport;
report.Design();
AppDomain.Unload(reportDomain);
reportDomain = null;
}

public class DinamicReport : MarshalByRefObject
{
public void Design()
{
   StiReport report = new StiReport();
   Thread t=new Tread(new ThreadStart(A));
   t.SetApartmentState(ApartmentState.STA)
   t.Start();
   t.Join();
}
public void A()
{
   report.Design(); 
}
}
Вопрос так и задумывалось или это ошибка?
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Выгрузка домена с отчетом

Сообщение Jan »

Здравствуйте,

Судя по всему в первом случае, WPF приложение отработав сворачивает тот поток в котором оно было запущено (т.к. WPF приложения STA). Во втором случае оно было запущено в новом потоке и закрыло уже его, не причинив вреда первому потоку. Здесь вопросы уже не совсем по нашему продукту, больше к механизму работы WPF приложений в потоках. Можно почитать некоторую информацию здесь:

http://www.a2zdotnet.com/View.aspx?Id=93

Спасибо.
Ответить