我试图获取程序集列表。但我在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?,但这无法解决我的问题。
答案 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();
。
答案 1 :(得分:0)
Windows.UI.Xaml.Application.Current.GetType().GetTypeInfo().Assembly;