Почему не берется новая версия длл если я подменяю длл после первого прохода.
То есть один раз прошел в цикле пересобрал длл с новым возвращаемым значением и возвращается всё равно старая версия функции.
Пробовал менять версию вызываемой длл и ее гуид — не помогло
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();
}
Здравствуйте, 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
Здравствуйте, 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++;
}