【问题标题】:Is there an alternative to AppDomain.GetAssemblies on portable project?在可移植项目上是否有 AppDomain.GetAssemblies 的替代方案?
【发布时间】:2018-10-14 15:10:27
【问题描述】:

我试图获取程序集列表。但是我在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} H结果:-2146233079 帮助链接:空 内部异常:空 消息:“API 'System.AppDomain.get_CurrentDomain()' 不能在当前平台上使用。有关更多信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=248273。” 资料来源:“mscorlib” StackTrace: " 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化)\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”

当前上下文中不存在名称“线程”

当前上下文中不存在名称“线程”

我检查了Is there an alternative to AppDomain.GetAssemblies on portable library?,但这无助于解决我的问题。

【问题讨论】:

  • PCL 正式死亡。 .NET Standard 2.0 已经有了相关的 API。
  • @LexLi 如何通过 .NET Standard 获得它

标签: c# xamarin uwp portable-class-library


【解决方案1】:

首先,.NET 标准库是可移植类库 (PCL) 的替代品。请参阅.NET Standard 2.0 Support in 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 开始,您可以直接在 UWP 应用中使用 AppDomain.GetAssemblies 来获取程序集。

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

您需要下载Visual Studio 2017 15.4或以上版本并设置您的应用目标版本和最低版本Windows 10 Fall Creators Update (16299)。此外,您还可以创建一个.Net Standard 2.0 类库来使用AppDomain.GetAssemblies

【讨论】:

    【解决方案2】:
    Windows.UI.Xaml.Application.Current.GetType().GetTypeInfo().Assembly;
    

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多