仅在Windows应用商店应用中从完全限定名称获取类型

时间:2013-05-18 09:49:28

标签: c# reflection windows-8 windows-store-apps .net-assembly

我有一个包含完整限定名称的字符串,例如MyNamespace.MyType,我知道它在加载的程序集中。

我需要在Windows应用商店中获取此Type实例。

我遇到的问题是,虽然Windows应用商店中有一些反射类,但它非常有限,我根本无法使用我用于桌面应用的内容。

如果我可以获得一个程序集,我可以在其中找到我的类型,所以我正在尝试获取所有已加载的程序集,由于AppDomain不存在,我无法轻松完成。

我发现了以下内容:

private async System.Threading.Tasks.Task<IEnumerable<Assembly>> GetAssembliesCore()
{
    var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;

    List<Assembly> assemblies = new List<Assembly>();
    foreach (Windows.Storage.StorageFile file in
                 await folder.GetFilesAsync().AsTask().ConfigureAwait(false))
    {
        if (file.FileType == ".dll")
        {
            AssemblyName name = new AssemblyName() { Name = file.Name };
            Assembly asm = Assembly.Load(name);
            assemblies.Add(asm);
        }
    }

    return assemblies;
}

我添加.AsTask().ConfigureAwait(false)以阻止它挂起,但它现在无法尝试加载程序集:

  

“无法加载文件或程序集'FDE.Audio.dll'或其依赖项之一   系统找不到指定的文件。“:”FDE.Audio.dll“

我需要在清单中设置一些东西吗?还有别的吗?

如何在程序的文件夹中加载程序集(我认为AppX)?

1 个答案:

答案 0 :(得分:1)

尝试提取不带扩展名的文件名

var filename = file.Name.Substring(0, file.Name.Length - file.FileType.Length);

AssemblyName name = new AssemblyName() { Name = filename };
Assembly asm = Assembly.Load(name);