Как определить загружена ли сборка из файла или из массива байт
От: drVanо Россия https://vmpsoft.com
Дата: 04.10.23 12:28
Оценка:
Сейчас пользуюсь Assembly.Location (при загрузке из массива байт возвращает пустую строку), но из-за особенности работы нетового рантайма
Автор: drVanо
Дата: 04.10.23
нужен какой-то другой способ.

Пока на ум пришло следующая реализация через WinAPI:
if (GetModuleFileName(Marshal.GetHINSTANCE(module), ...) != 0)
  // загрузили из файла


Какие есть еще способы?
Re: Как определить загружена ли сборка из файла или из массива байт
От: mDmitriy Россия  
Дата: 04.10.23 13:00
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Какие есть еще способы?

у сборки из массива будет имя файла?
Re[2]: Как определить загружена ли сборка из файла или из массива байт
От: drVanо Россия https://vmpsoft.com
Дата: 04.10.23 13:06
Оценка:
Здравствуйте, mDmitriy, Вы писали:

V>>Какие есть еще способы?

D>у сборки из массива будет имя файла?

Что такое имя файла?
Re[3]: Как определить загружена ли сборка из файла или из массива байт
От: mDmitriy Россия  
Дата: 05.10.23 10:09
Оценка:
Здравствуйте, drVanо, Вы писали:

V>Что такое имя файла?

var assembly = AppDomain.CurrentDomain.Load(<>);
var fName = assembly.GetModules()?[0]?.FullyQualifiedName;

например
Re[4]: Как определить загружена ли сборка из файла или из массива байт
От: drVanо Россия https://vmpsoft.com
Дата: 05.10.23 10:26
Оценка:
Здравствуйте, mDmitriy, Вы писали:

V>>Что такое имя файла?

D>var assembly = AppDomain.CurrentDomain.Load(<>);
D>var fName = assembly.GetModules()?[0]?.FullyQualifiedName;

Module.FullyQualifiedName в результате вызывает Assembly.Location с инициализацией внутренностей AppDomain у которого пустой TargetFrameworkName:
            string targetFrameworkMoniker = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;

            // If we don't have a TFM then we should default to the 4.0 behavior where all quirks are turned on.
            if (!TryParseFrameworkName(targetFrameworkMoniker, out identifier, out version, out profile))
            {
...
             {
                    identifier = ".NETFramework";
                    version = 40000;
                    profile = string.Empty;
                }
            }
        }


Поведение версии 40000 очень сильно отличается от 4.Х и у программы после этого меняется поведение (например она перестает работать с длинными именами файлов).

Я как раз и спрашивал о других возможных способах, которые в итоге не вызывают Assemnbly.Location.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.