【发布时间】:2020-02-29 07:53:54
【问题描述】:
我正在尝试构建一个动态 Web 界面,我可以在其中动态地指向一个文件夹并使用 ASP.NET Core 从该文件夹中提供 Web 内容。通过使用 ASP.NET Core 中的 FileProviders 重新路由 Web 根文件夹,这很容易实现。这适用于 StaticFiles 和 RazorPages。
但是,对于 RazorPages,问题在于一旦执行此操作,您就无法为其他类型动态添加引用。我希望能够选择添加一个文件夹(PrivateBin),在启动时我可以循环访问,加载程序集,然后让这些程序集在 Razor 中可见。
不幸的是,它不起作用,因为即使使用运行时编译,Razor 似乎也看不到加载的程序集。
我在启动期间使用以下内容来加载程序集。请注意,加载这些文件的文件夹不在默认的 ContentRoot 或 WebRoot 中,而是在新的重定向 WebRoot 中。
// WebRoot is a user chosen Path here specified via command line --WebRoot c:\temp\web
private void LoadPrivateBinAssemblies()
{
var binPath = Path.Combine(WebRoot, "PrivateBin");
if (Directory.Exists(binPath))
{
var files = Directory.GetFiles(binPath);
foreach (var file in files)
{
if (!file.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase) &&
!file.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
continue;
try
{
var asm = AssemblyLoadContext.Default.LoadFromAssemblyPath(file);
Console.WriteLine("Additional Assembly: " + file);
}
catch (Exception ex)
{
Console.WriteLine("Failed to load private assembly: " + file);
}
}
}
}
程序集加载到 AssemblyLoadContext() 中,我可以 - 使用反射和 Type.GetType("namespace.class,assembly") - 访问类型。
但是,当我尝试访问 RazorPages 中的类型时 - 即使启用了运行时编译 - 类型也不可用。我收到以下错误:
为了确保该类型确实可用,我检查了我是否可以在 Razor 中执行以下操作:
@{
var md = Type.GetType("Westwind.AspNetCore.Markdown.Markdown,Westwind.AspNetCore.Markdown");
var mdText = md.InvokeMember("Parse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null,
null, new object[] { "**asdasd**", false, false, false });
}
@mdText
而且效果很好。所以程序集被加载并且类型是可访问的,但 Razor 似乎没有意识到这一点。
所以问题是:
是否可以在运行时加载程序集并通过运行时编译使它们可用于 Razor,并像通常通过直接声明访问使用类型一样使用它?
【问题讨论】:
-
看起来 RazorPage 编译选项有
opt.AdditionalReferencePaths的选项。这让我更接近,但目前仍然无法加载......
标签: c# razor-pages asp.net-core-3.0