反编译 EPiServer 源码发现当forceBinFolderScan属性设置为true时,EPiServer 框架会扫描 bin 文件夹中的每个 dll。它遍历所有 dll 并将它们加载到 AppDomain 中。
如果此属性设置为false,它不会扫描 bin 文件夹,而是依赖于 ASP.NET 程序集加载。
从 bin 将程序集加载到 AppDomain 后(或者如果属性为false则不加载),它会从 AppDomain 获取所有程序集,然后根据添加/删除配置过滤它们。所以添加/删除标签不会影响 bin 文件夹扫描。
实际上,这种行为和这种行为的原因在 EPiServer 文档中有所描述:MEF - The Discovery Mechanism(参见段落底部的注释)。作者只是没有提到它是由forceBinFolderScan属性控制的。
更新
这是一个描述该行为的示例。
假设我们有两个程序集:MyPlugins.dll - 包含一些插件和NoPlugins.dll。还假设这些 DLL 不是由 ASP.NET 在应用程序启动时加载的。
我们有这个配置,它告诉不要强制扫描 bin 文件夹并包括除NoPlugins.dll之外的所有程序集:
<scanAssembly forceBinFolderScan="false">
<add assembly="*" />
<remove assembly="NoPlugins.dll" />
</scanAssembly>
使用这样的配置MyPlugins.dll和NoPlugins.dll不会加载到 AppDomain 中并且无法扫描。所以没有插件可用。
如果我们设置 forceBinFolderScan="true":
<scanAssembly forceBinFolderScan="true">
<add assembly="*" />
<remove assembly="NoPlugins.dll" />
</scanAssembly>
通过这样的配置,两个 DLL 都从 bin 文件夹显式加载到 AppDomain。然后过滤发生,NoPlugins.dll从模块/插件扫描集合中删除。因此,来自MyPlugins.dll的插件将被加载。
更新 2
测试了不同的配置以查看优化是否有帮助,但似乎过滤程序集会产生更糟糕的结果。
我的站点有很多程序集,因此启动需要很长时间。我尝试了 3 种不同的场景。
1:
<scanAssembly forceBinFolderScan="false">
<add assembly="*" />
<!-- Remove assemblies generated by EPiOptimizer -->
<remove assembly="..." />
</scanAssembly>
2:
<scanAssembly forceBinFolderScan="false">
<add assembly="*" />
</scanAssembly>
3:
<scanAssembly forceBinFolderScan="true">
<add assembly="*" />
</scanAssembly>
我每次执行了 3 次简单测试 - 进行了 iisreset 并在 Chrome 刷新页面并检查了时间线(我知道这不是完美的测试),结果如下:
1: 1.3 分钟、1 分钟、1.3 分钟
2: 1 分钟、57 秒、1 分钟
3:57秒、57 秒、57 秒
我以不同的顺序尝试了这些测试几次,但结果是一样的。所以通过添加标签来进行优化是不合理的。过滤掉 AppDomain 中加载的程序集然后扫描所有程序集似乎更昂贵。奇怪的是,强制 bin 文件夹扫描会得到更好的结果,但可能是我的测试问题。