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

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

Добавлено: 26 июл 2010, 14:09
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();
        }
 
    }
После трех выполнений метода и закрытия дизайнера приложение тоже закрывается.

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

Добавлено: 27 июл 2010, 04:16
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;
			}
		}
Спасибо.

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

Добавлено: 27 июл 2010, 10:10
res562
Не понятно чем ваш код принципиально отличается от моего.
Обнаружил, что проблемы возникают только когда в новом домене открывается дизайнер отчетов. Если не открывать дизайнер или просто просматривать отчет то домен нормально выгружается, если же открыть дизаенер через report.Design() или создать эземпляр StiDesignerControl, то при выгрузке домена, где был открыт дизайнер, закрывается все приложение.

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

Добавлено: 27 июл 2010, 11:50
Jan
Здравствуйте,

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

Спасибо.

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

Добавлено: 03 авг 2010, 10:50
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 оно сразу закрывается.

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

Добавлено: 04 авг 2010, 10:21
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(); 
}
}
Вопрос так и задумывалось или это ошибка?

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

Добавлено: 04 авг 2010, 10:44
Jan
Здравствуйте,

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

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

Спасибо.