У меня есть приложение, которое использует плагины, которые скомпилированы на лету.Чтобы избежать использования dll, я запускаю его через новый домен приложения следующим образом:
[System.STAThreadAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main(string[] args)
{
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
// Loader
var entryPoint = System.Reflection.Assembly
.GetExecutingAssembly();
var applicationName = entryPoint.GetName().Name;
// Create the setup for the new domain:
var setup = new AppDomainSetup();
setup.ApplicationName = applicationName;
setup.ShadowCopyFiles = "true"; // note: it isn't a bool
// Create the application domain. The evidence of this
// running assembly is used for the new domain:
AppDomain domain = AppDomain.CreateDomain(
applicationName,
AppDomain.CurrentDomain.Evidence,
setup);
try
{
// Start MyApplication by executing the assembly:
domain.ExecuteAssembly(entryPoint.Location, args);
AppDomain.Unload(domain);
}
catch
{
}
}
else
{
// Main
ActualMain(args);
}
}
public static int ActualMain(string[] args)
{
MyApp.App app = new MyApp.App();
app.InitializeComponent();
app.Run();
return 0;
}
Это прекрасно работает, но при закрытии приложения возникает исключение CannotUnloadAppDomainException при вызове AppDomain.Unload (домен).Я ловлю это исключение, но я хотел спросить, нормально ли это или это плохая практика?В моем приложении C # WPF используется нативная DLL-библиотека c ++, которая, как я подозреваю, означает, что выгрузка не работает должным образом.
Спасибо!