Есть ли альтернатива AppDomain.GetAssemblies в переносимом проекте? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь получить список сборок. Но я столкнулся с исключением в portable проекте UWP.

Следующий код работает в

.netframework

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

Xamarin portable

var currentdomain = typeof(string).GetTypeInfo().Assembly.GetType("System.AppDomain").GetRuntimeProperty("CurrentDomain").GetMethod.Invoke(null, new object[] { });
var getassemblies = currentdomain.GetType().GetRuntimeMethod("GetAssemblies", new Type[] { });
var assemblies = getassemblies.Invoke(currentdomain, new object[] { }) as Assembly[];

Но тот же код выше не работает в UWP portable. (Я думаю, что в UWP портативный тоже работает)

При получении первой строки у меня возникает следующая проблема

'typeof (string) .GetTypeInfo (). Assembly.GetType ("System.AppDomain"). GetRuntimeProperty ("CurrentDomain"). GetMethod.Invoke (null, new object [] {})' вызвала исключение типа 'System.InvalidOperationException'
Данные: {System.Collections.ListDictionaryInternal} HResult: -2146233079 HelpLink: ноль InnerException: ноль Сообщение: «API« System.AppDomain.get_CurrentDomain () »не может использоваться на текущей платформе. См. http://go.microsoft.com/fwlink/?LinkId=248273 для получения дополнительной информации». Источник: "Мскорлиб" StackTrace: "at System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, связыватель Binder, параметры Object [], CultureInfo culture) \ r \ n в System.Reflection.MethodBase.Invoke (Object obj, Object [] параметры) «

Если я использую код ниже

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Assembly[] assembly = ((dynamic)Thread.GetDomain()).GetAssemblies() as Assembly[];
var loadedAssemblies = ((dynamic)Thread.GetDomain()).GetAssemblies() as Assembly[];

тогда я получаю следующую ошибку.

Имя AppDomain не существует в текущем контексте

Имя 'Нить' не существует в текущем контексте

Имя 'Нить' не существует в текущем контексте

Я проверил Есть ли альтернатива AppDomain.GetAssemblies в переносимой библиотеке? , но это не помогло исправить мою проблему.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018
Windows.UI.Xaml.Application.Current.GetType().GetTypeInfo().Assembly;
0 голосов
/ 09 мая 2018

Во-первых, стандартные библиотеки .NET являются заменой переносимым библиотекам классов (PCL). См. Поддержку .NET Standard 2.0 в Xamarin.Forms . Вы можете использовать следующий код, чтобы получить все сборки в пакете приложения UWP,

private async Task<List<Assembly>> GetAssemblyListAsync()
{
    var PackageFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;

    List<Assembly> assemblies = new List<Assembly>();
    foreach (StorageFile file in await PackageFolder.GetFilesAsync())
    {
        if (file.FileType == ".dll" || file.FileType == ".exe")
        {
            AssemblyName name = new AssemblyName() { Name = file.Name };
            Assembly asm = Assembly.Load(name);
            assemblies.Add(asm);
        }
    }
    return assemblies;
}

Однако из .Net стандарта 2.0 вы можете использовать AppDomain.GetAssemblies непосредственно в приложении UWP для получения сборок.

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

Вам необходимо загрузить Visual Studio 2017 15.4 или выше и установить целевую версию приложения и минимальную версию Windows 10 Fall Creators Update (16299). Кроме того, вы также можете создать библиотеку классов .Net Standard 2.0 для использования AppDomain.GetAssemblies.

enter image description here

...