我正在尝试使用反射的 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 构建中存在反射。
编译器有时可能无法检测代码库中使用的反射类型。在这种情况下,应该创建 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