This repository has been archived on 2024-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
Sic06/SicUI/Bootstrapper.cs

312 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Caliburn.Micro;
using Caliburn.Micro.Core;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceModel.Configuration;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows;
using System.Xml.Linq;
using Aitex.Core.RT.Log;
using Aitex.Core.Util;
using Aitex.Core.WCF;
using CommandLine;
using MECF.Framework.UI.Client.ClientBase;
using SciChart.Charting.Visuals;
namespace SicUI.Client
{
public class Bootstrapper : BootstrapperBase
{
#region Variables
private Splash _splashScreen;
#endregion
//static Mutex mutex;
//bool isNewMutex;
protected override void OnStartup(object sender, StartupEventArgs e)
{
// 解析启动参数
CommandLine.Parser.Default.ParseArguments<StartupOptions>(e.Args)
.WithParsed<StartupOptions>(o =>
{
if (o.RtHostIpAddress)
{
// 启动RT远程主机地址配置窗口
_splashScreen?.Complete();
try
{
var clientSection =
ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
var ip =
clientSection?.Endpoints.Cast<ChannelEndpointElement>().First().Address.Host;
var ipConfigWin = new RtIpAddressInput(ip);
var dlg = ipConfigWin.ShowDialog();
if (dlg != true)
{
Environment.Exit(-2);
}
// 修改app.config中的WCF Host地址。
var path = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.FilePath; //path to app.Config
// 备份文件
File.Copy(path, $"{path}.{DateTime.Now.ToString("yyyyMMddHHmmss")}.old");
//then:s
var doc = XDocument.Load(path);
var query = doc.Descendants("endpoint").ToList();
const string PATTERN = "(net.tcp:\\/\\/)(.+)(:[0-9]+\\/.+)";
foreach (var item in query)
{
var attr = item.Attribute("address");
if (attr == null)
continue;
var uri = attr.Value;
var isMatch = Regex.IsMatch(uri, PATTERN);
if (isMatch == false)
continue;
uri = Regex.Replace(uri, PATTERN,
m => m.Groups[1] + ipConfigWin.RtHostAddress + m.Groups[3]);
attr.SetValue(uri);
}
doc.Save(path);
var info = $"配置成功RT主机地址更改为{ipConfigWin.RtHostAddress}。";
LOG.Info(info);
MessageBox.Show(info, "成功",
MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
var err = $"无法更改RT主机地址{ex.Message}";
LOG.Error(err, ex);
MessageBox.Show(err, "成功",
MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
Environment.Exit(0);
}
}
else
{
// 正常启动
#if SHOW_SPLASH_SCREEN
#region Show Splash Screen
var resetSplashCreated = new ManualResetEvent(false);
var splashThread = new Thread(() =>
{
_splashScreen = new Splash();
_splashScreen?.Show();
resetSplashCreated.Set();
System.Windows.Threading.Dispatcher.Run();
});
splashThread.SetApartmentState(ApartmentState.STA);
splashThread.IsBackground = true;
splashThread.Name = "Splash Screen";
splashThread.Start();
resetSplashCreated.WaitOne();
#endregion
#endif
try
{
#region RTRT
// 是否连接到本地RT。
var isConnectToLocalRt = true;
var clientSection =
ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
var hosts =
clientSection?.Endpoints.Cast<ChannelEndpointElement>()
.GroupBy(x => x.Address.IsLoopback)
.ToList();
// 获取 WCF Host IP地址失败。
if (hosts == null)
{
_splashScreen?.ShowErrorMessageBox(
"Unable to get the ip address of host which is running SicRT, please check the settings in app.config.");
Environment.Exit(-1);
return;
}
// 连接到多个WCF Host
if (hosts.Count != 1)
{
_splashScreen?.ShowErrorMessageBox(
"It seems that you are trying to connect multiple SicRT hosts, please check the settings in app.config.");
Environment.Exit(-1);
return;
}
var isLoopback = hosts[0].Key;
if (!isLoopback)
isConnectToLocalRt = false;
var hostEndpoint = clientSection.Endpoints.Cast<ChannelEndpointElement>().First();
#endregion
_splashScreen?.SetMessage1(
$"Connecting to SicRT ({hostEndpoint.Address.Host}), please wait ...");
if (isConnectToLocalRt)
{
// 如果WCF的Client IP中存在本机地址则启动本地RT
var processRt = Process.GetProcesses()
.FirstOrDefault(x => x.ProcessName.Contains("SicRT"));
if (processRt == null)
{
// 如果SicRT没有启动则启动之。。
var processModule = Process.GetCurrentProcess().MainModule;
if (processModule != null)
{
var exeFilePath = processModule.FileName;
if (!Debugger.IsAttached)
{
exeFilePath = exeFilePath.Replace("SicUI", "SicRT");
Process.Start(exeFilePath);
Thread.Sleep(1000);
}
}
}
}
if (!EventClient.Instance.ConnectRT())
{
_splashScreen?.Complete();
MessageBox.Show("Can not connect with RT, launch RT first", "Error",
MessageBoxButton.OK, MessageBoxImage.Error);
Environment.Exit(0);
return;
}
}
catch (Exception ex)
{
_splashScreen?.Complete();
MessageBox.Show($"Unable to start SicUI, {ex.Message}", "Error", MessageBoxButton.OK,
MessageBoxImage.Error);
Environment.Exit(0);
return;
}
_splashScreen?.SetMessage1("Initialize logging system ...");
Singleton<Aitex.Core.RT.Log.LogManager>.Instance.Initialize();
_splashScreen?.SetMessage1("Initialize sub modules ...");
BaseApp.Instance = new ClientApp();
_splashScreen?.SetMessage1("Loading the window ...");
var dictArguments = new Dictionary<string, object>
{
{ nameof(MainView.SplashScreen), _splashScreen }
};
DisplayRootViewFor<MainViewModel>(dictArguments);
base.OnStartup(sender, e);
}
})
.WithNotParsed(errs =>
{
});
}
protected override void OnExit(object sender, EventArgs e)
{
base.OnExit(sender, e);
Singleton<Aitex.Core.RT.Log.LogManager>.Instance.Terminate();
Application.Current.Shutdown();
}
protected override void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
if (e.Exception != null)
{
LOG.Write(e.Exception);
if (e.Exception.InnerException != null)
LOG.Write(e.Exception.InnerException);
}
e.Handled = true;
}
private SimpleContainer container;
public Bootstrapper()
{
SciChartSurface.SetRuntimeLicenseKey("vwAIyu6FysOMMV/v7pag3WEENpK0hDMQx5zbMKYtlb3PMTsV9R+v2toHl/Z2YJ7t/MDVkKCBsZjBxOUs1djpkyLqgCFMlX5DMrKFdP82QRqZRCOht0hQjW5Omy5z9ZRbalxSx4mlgnL/YXWr2JQrD1dWoTeoDP7xm8JB3+KZ4M5pqxeUCib6VvRpfq3O7HVIyFfcDk0JVByjV+vtgGpOo5RP630lKr9VLS3CPk1aUeul4XQAnJX+IafLnsgSKiDWlZMYU9qJehqA1EdwOnEvvOwhcwckJ5/BoeQ0qDvDaYZ1Jfzkcv5sqOYKd749TJ8wsoTDubT/bLv+BwBiXura1mBZlOIE9zB5XwJVedWWzi6dGDG8LRRKh1XjuyD6V92G596xYsb5b8EJJ8AkgsC/R+fLeN/FIZBlq/Vepg+1dwkLlCCtp8nZWBjsRDQWNrG6Vyk5TF2RzI62WrwKfWfNWXtC5wjkJE5IJzUFlj/B/UhCzB8=");
//SciChartSurface.SetRuntimeLicenseKey("e41PBy3F+6CYUmKsD0et09JuQ2ozGaZr8G8w5F0XkCoL1Hj/3o7wjMPkF7qbRHubQz0WZMECsBCMyWI2IW4GsIgaJ8vz8Fv8KomnX419tAErZAwBF3ld6GabG6Sk2g2nlzmO7A6Kv2bCbgudqxZxnalZMbB1PrPeo+c/Mve4weHPMBZpXiZkvMBpsrEWUbDgbjKHUAMyHyihfwFO4WlK+WF6aixbr3/r2KyTgn9DLCpf944CfziAVggPNx3fdIKvdyFfZ3KnFjbMR9/nSXXFV84+rocDwFgjzUrsHoBpSOL3hmgHF4F6XP2OMJOnlHuo0/Z3jqgddawZDpoXxPU6wLQkR5JH8Vy12Pl8/CwE9LV1Qlk+XVXurNkBaazcfcER4Sx1VBarSdEhr9lMrc4u6TW67L0oS51N8yM+hfBORzCVJLpA9P9SibBoB5/lFtPEnKfctOyLUIVNGQglpha9CAMcyqVZWgL6KI2xasw9wk4f1t0CshRoqUbnhzd3nFYvDiYvM9pQigw5F144VZfED2crA05qGtDAbmWGrRc955QqKcPCVTu+C71T+pYVZteCuLe6pK87UdgDRaxQ4yKfVuKL/Q4=");
Initialize();
}
protected override void Configure()
{
container = new SimpleContainer();
container.Singleton<IEventAggregator, EventAggregator>();
container.Singleton<IWindowManager, WindowManager>();
//container.Singleton<IPublisher, Publisher>();
container.PerRequest<MainViewModel>();
}
protected override object GetInstance(Type service, string key)
{
return container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
}
}