Имам следния клас (съкратен за по-лесно четене)
public class Connection
{
Guid _id;
AppDomain _appDomain;
Type _coreApp;
public string ConnectionName
{
get
{
this._coreApp.InvokeMember("_some_property_", BindingFlags.GetProperty, null, null, null).ToString();
}
}
public Connection(string username, string password)
{
this._id = Guid.NewGuid();
this._appDomain = AppDomain.CreateDomain(this._id.ToString());
Assembly asm = this._appDomain.Load("_some_dll_");
this._coreApp = asm.GetExportedTypes().First(t => t.Name == "_some_type_");
this._coreApp.InvokeMember("_some_method_", BindingFlags.InvokeMethod, null, null, new object[] { username, password });
}
}
Имам и следния код
public class Main()
{
public Main()
{
Connection connOne = new Connection("_some_user_1_", "_some_pw_1_");
Connection connTwo = new Connection("_some_user_2_", "_some_pw_2_");
string nameOne = connOne.ConnectionName;
string nameTwo = connTwo.ConnectionName;
}
}
Разбрах и тези факти:
- Dll, който зареждам в AppDomain, е трета страна
- _some_method_ и _some_property_ са статични
- ConnectionName трябва да връща различни стойности за двата екземпляра, тъй като параметрите не са еднакви.
И последно получих този проблем:
Работех при предположението, че извикването на статичен метод от Type в DLL в неговия собствен AppDomain ще изолира това извикване от други към същия статичен метод в същия DLL в отделен AppDomain, но по някаква причина това не е случаят. Ако стартирам кода по този начин, например ще получа и двата низа като "result_1", обръщането на параметрите ще зададе и двата низа на "result_2".
По принцип трябва да изолирам напълно dlls във всеки екземпляр на Connection, тъй като се случват много статични неща и не мога да накарам едното да променя другото, както е в случая.
Не съм сигурен, че кодът дори се компилира, моля, игнорирайте всякакви граматически или семантични проблеми, тъй като не мога да публикувам действителния код и трябваше да напиша това в движение и в браузъра.