Не берется новая версия длл
От: e.thrash  
Дата: 11.09.18 17:06
Оценка:
Почему не берется новая версия длл если я подменяю длл после первого прохода.
То есть один раз прошел в цикле пересобрал длл с новым возвращаемым значением и возвращается всё равно старая версия функции.
Пробовал менять версию вызываемой длл и ее гуид — не помогло


 static void Main(string[] args)
        {
            int cnt = 0;
            while (Console.ReadLine().Length < 3)
            {
                var appDomain = AppDomain.CreateDomain($"test, cnt");
                var assemblyName = new AssemblyName
                {
                    CodeBase = @"d:\SharedDll.dll"
                };
                Assembly assembly = appDomain.Load(assemblyName);

                var theType = assembly.GetType("SharedDll.Class1");
                var c = Activator.CreateInstance(theType);
                var method = theType.GetMethod("Get");
                var retVal = method.Invoke(c, new object[] { });
                
                Console.WriteLine(retVal);
                cnt++;
                AppDomain.Unload(appDomain);

                GC.Collect(); // collects all unused memory
                GC.WaitForPendingFinalizers(); // wait until GC has finished its work
                GC.Collect();
            }

            Console.WriteLine("Finish");
            Console.ReadLine();
        }
Re: Не берется новая версия длл
От: vmpire Россия  
Дата: 11.09.18 18:13
Оценка: 2 (1)
Здравствуйте, e.thrash, Вы писали:

ET>Почему не берется новая версия длл если я подменяю длл после первого прохода.


ET>
ET> static void Main(string[] args)
ET>        {
ET>            int cnt = 0;
ET>            while (Console.ReadLine().Length < 3)
ET>            {
ET>                var appDomain = AppDomain.CreateDomain($"test, cnt");
ET>                var assemblyName = new AssemblyName
ET>                {
ET>                    CodeBase = @"d:\SharedDll.dll"
ET>                };
ET>                Assembly assembly = appDomain.Load(assemblyName);

ET>                var theType = assembly.GetType("SharedDll.Class1");
ET>                var c = Activator.CreateInstance(theType);
ET>                var method = theType.GetMethod("Get");
ET>                var retVal = method.Invoke(c, new object[] { });
                
ET>                Console.WriteLine(retVal);
ET>                cnt++;
ET>                AppDomain.Unload(appDomain);

ET>                GC.Collect(); // collects all unused memory
ET>                GC.WaitForPendingFinalizers(); // wait until GC has finished its work
ET>                GC.Collect();
ET>            }

ET>            Console.WriteLine("Finish");
ET>            Console.ReadLine();
ET>        }
ET>


Как только вы вызываете Activator.CreateInstance(theType) сборка загружается в основной домен приложения. Где потом и пребывает.
Новая версия не загружается, так как одновременно в домене может быть только одна версия сборки.

Если хотите загрузить сборку в другой домен, используйте AppDomain.CreateInstanceAndUnwrap
Re[2]: Не берется новая версия длл
От: e.thrash  
Дата: 16.09.18 15:00
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, e.thrash, Вы писали:


ET>>Почему не берется новая версия длл если я подменяю длл после первого прохода.



V>Если хотите загрузить сборку в другой домен, используйте AppDomain.CreateInstanceAndUnwrap


сделал так, всё равно не подхватывается новая версия.
Пробовал с CopyShadow — тоже не берется.
  int cnt = 0;
            while (Console.ReadLine().Length < 3)
            {                
                var appDomain = AppDomain.CreateDomain($"testDomain{cnt}");             
                var entity = (Class1)appDomain.CreateInstanceFromAndUnwrap(@"C:\OtherProject\bin\Debug\SharedDll.dll", "SharedDll.Class1");
                
                Console.WriteLine(entity.Get());

                AppDomain.Unload(appDomain);
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                cnt++;
            }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.