我正在使用ASP.NET core 2.1。我从 plugins 文件夹中动态加载所有具有Views的程序集。我使用以下代码。视图已正确加载。
services.AddMvc().
AddRazorPagesOptions(o => o.AllowAreas = true).
SetCompatibilityVersion(CompatibilityVersion.Version_2_1).
ConfigureApplicationPartManager(ConfigureApplicationParts);
private void ConfigureApplicationParts(ApplicationPartManager apm)
{
var pluginsPath = Path.Combine(_env.WebRootPath, "Plugins");
var assemblyFiles = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories);
foreach (var assemblyFile in assemblyFiles)
{
var assembly = Assembly.LoadFile(assemblyFile);
if (assemblyFile.EndsWith(".Views.dll"))
{
apm.ApplicationParts.Add(new CompiledRazorAssemblyPart(assembly));
}
else
{
apm.ApplicationParts.Add(new AssemblyPart(assembly));
}
}
}
视图具有一些自定义的标记助手。
_ViewImports.cshtml 文件看起来像
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, MyTagHelpers
问题是自定义标签帮助程序未加载并出现错误:
错误:无法加载文件或程序集MyTagHelpers
我得到错误的原因可能是Razor View Engine可能正在主应用程序的 bin 文件夹中寻找DLL,但找不到该DLL并给出了此错误。 / p>
我应该在启动时说taghelpers在DLL中可用并且可以从DLL中加载吗?我应该使用TagHelperFeatureProvider来做到这一点吗?
更新:我将标记帮助器移动到名为 MyTagHelpers.Common 的单独的DLL中,并放置在plugins文件夹中。我再也没有遇到找不到程序集的错误,但是标记助手不起作用。
答案 0 :(得分:1)
尝试解决此问题2天后-请注意-“程序集名称”是经过编译(汇编的).DLL名称,通常与项目名称匹配,而项目名称可能不与名称空间名称匹配/字首!
因此,如果您的项目名称与我的名称空间不同,那么@addTagHelper引用就是用于创建已编译的.DLL的项目名称-请查看您的构建输出以进行检查。
因此,这通常也与.csproj文件的前缀相同,这就是为什么官方文档说要创建新应用的原因。