我尝试使用反射的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构建中。
1条答案
按热度按时间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