C# .NET Core 原生 AOT,带有反射 Activator.CreateInstance

问题描述 投票:0回答:1

我正在尝试使用反射的 Activator.CreateInstance 方法来生成具有如下参数的所需模块。

 public TModule CreateModule<TModule>(params object[]? parameters) where TModule : ApplicationModule
    {
        /*
         * Create module
         */
        TModule? module = Activator.CreateInstance(typeof(TModule), parameters) as TModule;
        if (module is null)
            throw new Exception($"Failed to create module with type: {typeof(TModule).Name}");

        /*
         * Register it to the pending modules
         */
        _pendingModules.Add(module);

        return module;
    }

但它总会回归。

  Unhandled Exception: System.MissingMethodException: No parameterless constructor defined for type 'Runtime.Reflection.ReflectionModule'.
   at System.ActivatorImplementation.CreateInstance(Type, Boolean) + 0x121
   at Runtime.Application.Application.CreateModule[TModule]() + 0x35
   at EditorPlayer.Program.Main(String[]) + 0x107
   at EditorPlayer!<BaseAddress>+0x862f1b

即使目标类有默认构造函数,它仍然会抛出相同的错误。我认为原生 AOT 构建中存在反射。

c# .net reflection aot native-aot
1个回答
1
投票

编译器有时可能无法检测代码库中使用的反射类型。在这种情况下,应该创建 rd.xml 文件并将其导入到项目设置中(rd 代表运行时指令)。在此 xml 文件中,您可以指定要使用的特定程序集中的类型,也可以直接指定类型,以便可以包含在本机 aot 构建中。

对于泛型类型,似乎在泛型方法末尾添加 new() 有助于编译器标记泛型类型并导出到本机 aot 构建中。

这里有一些链接可能有助于本机 aot 反射。

https://github.com/dotnet/corert/blob/master/Documentation/using-corert/reflection-in-aot-mode.md

https://github.com/dotnet/corert/blob/master/Documentation/using-corert/rd-xml-format.md

© www.soinside.com 2019 - 2024. All rights reserved.