После звонка
Managed c1 = new Managed();
Ваша управляемая оболочка.dll будет загружена в основной домен приложения. Пока это не будет, неуправляемые вещи домена из static.lib будут делиться с другими доменами.
Вместо того, чтобы создавать отдельный процесс, вам просто нужно быть уверенным (перед каждым вызовом), что managed.dll не загружен ни в один домен приложения.
Сравните с этим
static void Main(string[] args)
{
{
AppDomain ad = AppDomain.CreateDomain("NewDomain");
Managed c = ad.CreateInstanceAndUnwrap(a.FullName, typeof(Managed).FullName) as Managed;
int val2 = c.CallLibFunc();
// Value is zero
AppDomain.Unload(ad)
}
{
AppDomain ad = AppDomain.CreateDomain("NewDomain");
Managed c = ad.CreateInstanceAndUnwrap(a.FullName, typeof(Managed).FullName) as Managed;
int val2 = c.CallLibFunc();
// I think value is zero
AppDomain.Unload(ad)
}
}
`
ВАЖНО и: Если вы добавите только одну строку, JIT-компилятор загрузит managed.dll и магия исчезнет.
static void Main(string[] args)
{
{
AppDomain ad = AppDomain.CreateDomain("NewDomain");
Managed c = ad.CreateInstanceAndUnwrap(a.FullName, typeof(Managed).FullName) as Managed;
int val2 = c.CallLibFunc();
// Value is zero
AppDomain.Unload(ad)
}
{
AppDomain ad = AppDomain.CreateDomain("NewDomain");
Managed c = ad.CreateInstanceAndUnwrap(a.FullName, typeof(Managed).FullName) as Managed;
int val2 = c.CallLibFunc();
// I think value is one
AppDomain.Unload(ad)
}
Managed c1 = new Managed();
}
Если вы не хотите зависеть от таких строк, вы можете создать еще одну оболочку ManagedIsolated.dll, которая будет ссылаться на managed.dll и будет выполнять каждый вызов в отдельном домене с разгрузкой домена сразу после вызова. Основное приложение будет зависеть только от типов ManagedIsolated.dll, и Managed.dll не будет загружаться в основной домен приложения.
Это похоже на трюк, но может быть, это будет полезно для кого-то.
`