在ASP.NET Core 2.1中动态加载程序集时,TagHelpers不起作用

时间:2018-07-14 02:16:05

标签: razor asp.net-core razorengine

我正在使用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文件夹中。我再也没有遇到找不到程序集的错误,但是标记助手不起作用。

1 个答案:

答案 0 :(得分:1)

尝试解决此问题2天后-请注意-“程序集名称”是经过编译(汇编的).DLL名称,通常与项目名称匹配,而项目名称可能与名称空间名称匹配/字首!

因此,如果您的项目名称与我的名称空间不同,那么@addTagHelper引用就是用于创建已编译的.DLL的项目名称-请查看您的构建输出以进行检查。

因此,这通常也与.csproj文件的前缀相同,这就是为什么官方文档说要创建新应用的原因。