感谢群里大佬哇咔咔大佬的帮助。
我总结了一下大佬的操作,主要包含以下步骤
1.安装HybirdCLR
2.设置HybirdCLR settings , (热更新Dlls)Hot Update Assembiles 中增加一项内容为 Code ,(外部热更新dll搜索路径)External Hot Update Assembliy Dirs 中增加一项内容为 Temp/Bin/Debug
3.设置Playersettings Scripting Benkend 为IL2CPP , Api Compatibility Level* 为 .NET Framework
4.rider打开项目,点击build,构建出Temp/Bin/Debug里面的内容
5.拷贝以下几个dll文件至code目录 文件:mscorlib.dll,System.Core.dll,System.dll, Unity.Mono.dll, Unity.ThirdParty.dll, 源目录为\Unity\Temp\Bin\Debug\Unity.Mono, 目标目录为\Unity\Assets\Bundles\Code,并且增加后缀.bytes, 例:mscorlib.dll -> mscorlib.dll.bytes
6.F5 编译代码
7.运行HybirdCLR工具命令。 HybirdCLR/CompileDll/ActiveBuildTarget , HybirdCLR/Generate/All
8.修改CodeLoader代码 主要增加了一项CodeMode,看代码自行添加, 我的项目用的Yooasset,所有这里用Yooasset加载的代码
CodeLoader里面新增的代码:
case CodeMode.HybridCLR:
{
System.Runtime.Serialization.IgnoreDataMemberAttribute ignoreDataMemberAttribute;
RawFileOperationHandle rawFileOperationHandleDll = YooAssets.LoadRawFileSync("Code.dll");
RawFileOperationHandle rawFileOperationHandlePdb = YooAssets.LoadRawFileSync("Code.pdb");
byte[] assBytes = rawFileOperationHandleDll.GetRawFileData();
byte[] pdbBytes = rawFileOperationHandlePdb.GetRawFileData();
LoadMetadataForAOTAssemblies();
assembly = Assembly.Load(assBytes, pdbBytes);
foreach (Type type in this.assembly.GetTypes())
{
this.monoTypes[type.FullName] = type;
this.hotfixTypes[type.FullName] = type;
}
IStaticMethod start = new MonoStaticMethod(assembly, "ET.Entry", "Start");
start.Run();
break;
}
新增方的法代码:
private static void LoadMetadataForAOTAssemblies()
{
List<string> aotMetaAssemblyFiles = new List<string>()
{
"mscorlib.dll",
"System.dll",
"System.Core.dll",
"Unity.Mono.dll",
"Unity.ThirdParty.dll",
};
/// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。
/// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误
///
HomologousImageMode mode = HomologousImageMode.SuperSet;
foreach (var aotDllName in aotMetaAssemblyFiles)
{
RawFileOperationHandle rawFileOperationHandleDll = YooAssets.LoadRawFileSync(aotDllName);
byte[] dllBytes = rawFileOperationHandleDll.GetRawFileData();
// 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
}
}
- 9.mono程序集添加HybirdCLR的引用。
*
- 打包完成。