跳到主要内容

多个DHE程序集

存在多个DHE程序集时,可以根据每个程序集是否改变来决定调用LoadOriginalDifferentialHybridAssembly或LoadDifferentialHybridAssemblyUnchecked接口进行加载, 但有一些额外的限制。

限制条件

加载多个DHE程序集需要满足以下限制条件:

  • 按照程序集的依赖顺序先后加载
  • 如果某个DHE程序集使用LoadDifferentialHybridAssemblyUnchecked加载,那所有直接或者间接依赖它的DHE程序集必须也使用 LoadDifferentialHybridAssemblyUnchecked加载,即使这些程序集没有任何改变

LoadDifferentialHybridAssemblyUnchecked的传递性

因为一些复杂的实现原因,如果某个DHE程序集使用LoadDifferentialHybridAssemblyUnchecked加载,那所有直接或者间接依赖它的DHE程序集必须也使用 LoadDifferentialHybridAssemblyUnchecked加载。

例如:假设B程序集引用了A程序集:

程序集AB
加载方式LoadOriginalDifferentialHybridAssemblyLoadOriginalDifferentialHybridAssembly或LoadDifferentialHybridAssemblyUnchecked
加载方式LoadDifferentialHybridAssemblyUncheckedLoadDifferentialHybridAssemblyUnchecked

如果A程序集发生改变,即使B程序集没有改动,也必须使用LoadDifferentialHybridAssemblyUnchecked加载。

计算需要使用LoadDifferentialHybridAssemblyUnchecked加载的DHE程序集

假设你有多个DHE程序集 A1-An。某次更新的时候只有A1和A3发生改变,仅仅这两个程序集使用LoadDifferentialHybridAssemblyUnchecked加载是不够的, 所有直接或者间接依赖A1和A3的程序集都需要使用LoadDifferentialHybridAssemblyUnchecked来加载。当程序集数量少时这不是问题,你可以手动找出 依赖它们的程序集,但程序集数量较多时很容易出错。

自v7.5.0版本起,新增HybridCLR.Editor.DHE.BuildUtils::ComputeAssembliesLoadedByLoadDifferentialHybridAssembly函数用于根据已知变化的 DHE程序集列表计算出最终需要使用LoadDifferentialHybridAssemblyUnchecked加载的DHE程序集列表。

示例代码如下:

    BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
HybridCLRSettings settings = HybridCLRSettings.Instance;
string[] differentialHybridAssemblyList = settings.differentialHybridAssemblies;

string currentAssemblyDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);

var assList = BuildUtils.ComputeAssembliesLoadedByLoadDifferentialHybridAssembly(new string[] { "MyCode" }, differentialHybridAssemblyList, currentAssemblyDir);
foreach (var ass in assList)
{
Debug.Log($"assembly:{ass}");
}