【问题标题】:UWP .NET Native - Iterate Through Types and AssembliesUWP .NET Native - 遍历类型和程序集
【发布时间】:2017-09-28 04:23:24
【问题描述】:

我们需要遍历应用程序中的所有程序集,然后获取具有 DataContract 类型的 CustomAttribute 的类型。这是当前未针对 .NET Native 编译时在 UWP 中工作的代码:

    public async Task Initialise()
    {

        var files = await Package.Current.InstalledLocation.GetFilesAsync();
        if (files == null)
        {
            return;
        }

        _Assemblies = new List<Assembly>();

        foreach (var file in files.Where
            (
                file => (file.FileType.ToLower() == ".dll" || file.FileType == ".exe") &&
                !new List<string> { "clrjit", "clrcompression", "sqlite3", "ucrtbased" }.Contains(file.DisplayName)
            ))
        {
            try
            {
                _Assemblies.Add(Assembly.Load(new AssemblyName(file.DisplayName)));
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }

        _Types = _Assemblies.SelectMany
           (
           a => a.GetTypes().Where
               (
                   t => t.GetTypeInfo().GetCustomAttribute<DataContractAttribute>() != null ||
                   t.GetTypeInfo().GetCustomAttribute<CollectionDataContractAttribute>() != null
               )
           ).ToList();
    }

为 .NET Native 工具链编译时失败。首先,我们只看到一个程序集,它是一个 exe,并且其中没有类型。

我们需要改变什么?我们如何获取程序集及其类型?

注意:我们真正需要的是 .NET Native 支持和不支持的反射 API 的明确列表。

【问题讨论】:

  • 好吧,那是个坏主意。它与 api 支持没有任何关系,.NET Native 编译器非常积极地删除似乎不用于生成最小可执行文件的类型。反射是一个问题,反射类型名称在代码中并不明确。由于它在代码中找不到对这些属性类型的任何引用,因此不会包含它们。您必须手动将它们添加到 rd.xml 文件中。所有关于 .NET Native 的文档都谈到了这一点。
  • 这根本没有帮助。

标签: c# .net reflection types .net-native


【解决方案1】:

因此,标准 UWP 和 .NET Native 之间的主要区别在于,所有程序集都编译为机器代码,并且可能位于 exe 而不是 .NET 程序集 DLL 中,因此上述代码不再有效。但是,只要您确实知道正在使用哪些程序集,该方法仍然相同。在这种情况下,我对程序集进行了硬编码,但我可能会使用 Assembly.Load 方法在运行时动态加载程序集。但是,我不确定商店验证器是否允许此代码。如果验证器拒绝此代码,我可能需要单独提出一个问题。

    #region Public Methods

    public async Task Initialise()
    {
        _Assemblies = new List<Assembly>();
        _Assemblies.Add(typeof(ReflectionUtils).GetTypeInfo().Assembly);
        _Assemblies.Add(Assembly.Load(new AssemblyName("Adapt.Model.Helpdesk")));
        _Assemblies.Add(typeof(SavePage).GetTypeInfo().Assembly);
        _Assemblies.Add(typeof(XivicClient.WCF.ServiceCalls.GeneralCalls).GetTypeInfo().Assembly);

        _Types = _Assemblies.SelectMany
           (
           a => a.GetTypes().Where
               (
                   t => t.GetTypeInfo().GetCustomAttribute<DataContractAttribute>() != null ||
                   t.GetTypeInfo().GetCustomAttribute<CollectionDataContractAttribute>() != null
               )
           ).ToList();
    }
    #endregion

【讨论】:

  • 一旦我成功进入商店,我会将此标记为答案。
  • 此代码有效,并已成功通过 Microsoft 商店验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2018-05-20
  • 2020-02-08
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多