Как загрузить сборку .NET для операций отражения и впоследствии выгрузить ее?

Я пишу инструмент для сообщения информации о приложениях .NET, развернутых в средах и регионах в системах моего клиента.

Я хотел бы прочитать значения атрибутов сборки в этих assemblyх.

Это может быть достигнуто с помощью Assembly.ReflectionOnlyLoad , однако даже этот подход позволяет загружать сборку. Проблема здесь в том, что я не могу загрузить две сборки, которые имеют одинаковое имя из разных путей, поэтому, естественно, я не могу сравнивать одно и то же приложение, развернутое в разных системах.

На этом этапе я предполагаю, что решение будет включать использование временных приложений AppDomain .

Может ли кто-нибудь описать, как загрузить сборку в другой AppDomain , прочитать атрибуты из нее и затем выгрузить AppDomain ?

Это необходимо для сборки в файловой системе, а также в URL-адресах.

Из документации MSDN System.Reflection.Assembly.ReflectionOnlyLoad (String) :

Контекст только для отражения ничем не отличается от других контекстов. Ассембли, загруженные в контекст, могут быть выгружены только путем разгрузки домена приложения.

Поэтому я боюсь, что единственный способ выгрузить сборку – это разгрузить домен приложения. Чтобы создать новый AppDomain и загрузить в него сборки:

 public void TempLoadAssembly() { AppDomain tempDomain = AppDomain.CreateDomain("TemporaryAppDomain"); tempDomain.DoCallBack(LoaderCallback); AppDomain.Unload(tempDomain); } private void LoaderCallback() { Assembly.ReflectionOnlyLoad("YourAssembly"); // Do your stuff here } 

Хотя вы не собираетесь разгружать сборки, если вы просто пытаетесь получить номер версии файла, вы можете использовать System.Diagnostics.FileVersionInfo .

 var info = FileVersionInfo.GetVersionInfo(path); 

FileVersionInfo имеет следующие свойства:

 public string Comments { get; } public string CompanyName { get; } public int FileBuildPart { get; } public string FileDescription { get; } public int FileMajorPart { get; } public int FileMinorPart { get; } public string FileName { get; } public int FilePrivatePart { get; } public string FileVersion { get; } public string InternalName { get; } public bool IsDebug { get; } public bool IsPatched { get; } public bool IsPreRelease { get; } public bool IsPrivateBuild { get; } public bool IsSpecialBuild { get; } public string Language { get; } public string LegalCopyright { get; } public string LegalTrademarks { get; } public string OriginalFilename { get; } public string PrivateBuild { get; } public int ProductBuildPart { get; } public int ProductMajorPart { get; } public int ProductMinorPart { get; } public string ProductName { get; } public int ProductPrivatePart { get; } public string ProductVersion { get; } public string SpecialBuild { get; } 

Вы можете попробовать использовать Unmanaged Metadata API , который является COM и может быть легко использован из приложения .NET с каким-то оберткой.

Вы должны использовать домены приложений, нет другого способа выгрузить сборку. В основном вы должны использовать такой код:

 AppDomain tempDomain = AppDomain.CreateDomain («Temp Domain»);
 tempDomain.Load (монтаж);
 AppDomain.Unload (tempDomain);

Вы можете создать экземпляр в новом AppDomain и выполнить свой код в этом экземпляре.

 var settings = new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, }; var childDomain = AppDomain.CreateDomain(Guid.NewGuid().ToString(), null, settings); var handle = Activator.CreateInstance(childDomain, typeof(ReferenceLoader).Assembly.FullName, typeof(ReferenceLoader).FullName, false, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, null, CultureInfo.CurrentCulture, new object[0]); var loader = (ReferenceLoader)handle.Unwrap(); //This operation is executed in the new AppDomain var paths = loader.LoadReferences(assemblyPath); AppDomain.Unload(childDomain); 

Вот ReferenceLoader

 public class ReferenceLoader : MarshalByRefObject { public string[] LoadReferences(string assemblyPath) { var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath); var paths = assembly.GetReferencedAssemblies().Select(x => x.FullName).ToArray(); return paths; } } 
  • mscorlib.dll & System.dll
  • C # компиляция для 32/64 бит или для любого процессора?
  • Определить версию сборки (CLR) сборки
  • В чем разница между MOV и LEA?
  • Maven: добавьте зависимость к банке относительным путем
  • Размер сборки .NET влияет на производительность?
  • Медленная инструкция jmp
  • Примеры предварительной выборки?
  • Как скомпилировать и запустить программу C в Sublime Text 2?
  • Visual Studio 2010 не создает перед запуском при изменении кода
  • Безопасно ли читать конец конца буфера на одной странице на x86 и x64?
  • Давайте будем гением компьютера.