便携式项目上是否有AppDomain.GetAssemblies的替代方案?

时间:2018-05-04 07:40:51

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

我试图获取程序集列表。但我在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:null       InnerException:null       消息:“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 [] parameters) “

如果我使用以下代码

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

然后我得到以下错误。

  

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

     

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

     

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

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

2 个答案:

答案 0 :(得分:1)

首先,.NET标准库是可移植类库(PCL)的替代品。请参阅The Go Memory Model。您可以使用以下代码获取UWP应用程序包中的所有程序集

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

// looper code from above

var n int64    
func dostuff() {
    atomic.AddInt64(&n, 1)
}

func main() {
    l := &looper{
        pause: make(chan struct{}),
    }
    var init sync.WaitGroup
    init.Add(32)
    for i := 0; i < 32; i++ {
        go func() {
            init.Done()
            l.loop()
        }()
    }
    init.Wait()
    for i := 0; i < 100; i++ {
        l.whilePaused(func() { fmt.Printf("%d ", i) })
    }
    fmt.Printf("\n%d\n", atomic.LoadInt64(&n))
}

但是,从.Net standard 2.0,您可以直接在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; } 来获取程序集。

AppDomain.GetAssemblies

您需要下载.NET Standard 2.0 Support in Xamarin.Forms或更高版本并设置应用目标版本和最低版本Windows 10 Fall Creators Update(16299)。此外,您还可以创建.Net Standard 2.0类库以使用Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

Visual Studio 2017 15.4

答案 1 :(得分:0)

Windows.UI.Xaml.Application.Current.GetType().GetTypeInfo().Assembly;