带反射Activator.CreateInstance的C# .net核心原生AOT

wwwo4jvm  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(262)

我尝试使用反射的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构建中。

ekqde3dh

ekqde3dh1#

编译器有时似乎无法检测到代码库中使用的反射类型。在这种情况下,应该创建一个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

相关问题