Как да извикате статични методи в асемблиране в AppDomain

Имам следния клас (съкратен за по-лесно четене)

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, тъй като се случват много статични неща и не мога да накарам едното да променя другото, както е в случая.

Не съм сигурен, че кодът дори се компилира, моля, игнорирайте всякакви граматически или семантични проблеми, тъй като не мога да публикувам действителния код и трябваше да напиша това в движение и в браузъра.


person PedroC88    schedule 30.04.2015    source източник
comment
Можете ли да покажете къде зареждате типа в отделен AppDomain?   -  person Ron Beyer    schedule 30.04.2015
comment
Редът this._appDomain = AppDomain.CreateDomain(this._id.ToString()); не създава ли един AppDomain за това копие на Connection? И тогава не е ли this._coreApp = asm.GetExportedTypes().First(t =› t.Name == _some_type);_ инстанциране на тип от ТОЗИ AppDomain?   -  person PedroC88    schedule 30.04.2015
comment
Съжалявам, пропуснах тези редове при сканиране късно през нощта.   -  person Ron Beyer    schedule 30.04.2015
comment
вижте това: stackoverflow.com/questions/4298913/static-fields-in -домейн на приложението   -  person Ron Beyer    schedule 30.04.2015
comment
@RonBeyer не се колебайте да добавите този коментар като отговор, тъй като намерих там това, което търсех, благодаря.   -  person PedroC88    schedule 30.04.2015
comment
Бих, ако можех, но въпросът е затворен като дубликат. Радвам се, че го получихте.   -  person Ron Beyer    schedule 30.04.2015


Отговори (1)


Съгласен съм с @RonBeyer. Целият ви код и вашите извиквания на метод/свойства се изпълняват в същия AppDomain като този на вашия основен клас. Само фактът, че създавате нов AppDomain и правите AppDomain.Load, не означава, че сега изпълнявате код вътре в този друг AppDomain, който сте създали. В крайна сметка всичко, което правите, е да получите експортираните типове от сборката и след това да извикате свойство/метод на един от тези типове. Но никъде не изразявате, че извикването трябва да се случи в другия AppDomain.

Вижте тези публикации за малко информация относно извършването на обаждания между домейни на приложения:

Най-лесният начин за извършване на обаждане между домейни на приложения?

Кросс AppDomain повикването се изпълнява в домейна на повикващия

person Rajeev Goel    schedule 30.04.2015
comment
Благодаря @Rajeev, въпреки че не отговориха на конкретния ми въпрос, те бяха много полезни в разбирането на проблема ми. - person PedroC88; 30.04.2015