我目前正在尝试从外部程序集加载嵌入的ViewComponents。
我已将其包含在我的项目文件中:
<EmbeddedResource Include="Views\**\*.cshtml" />
所以当我检查实际的程序集并运行GetManifestResourceNames()时,我看到该文件已嵌入。
然后我在Startup.cs中的ConfigureService()中调用此方法:
public static IMvcBuilder GetModules(this IMvcBuilder mvcBuilder)
{
var embeddedFileProviders = new List<EmbeddedFileProvider>
{
new EmbeddedFileProvider(Assembly.GetCallingAssembly())
};
mvcBuilder.ConfigureApplicationPartManager(apm =>
{
foreach (string modulePath in Directory.GetFiles(Configuration.Settings.Path, "*.Module.dll"))
{
var assembly = Assembly.LoadFrom(modulePath);
var startUpType = (from t in assembly.GetTypes()
where t.GetInterfaces().Contains(typeof(IModuleStartup))
select t).FirstOrDefault();
RegisterModuleServices(mvcBuilder, startUpType);
apm.ApplicationParts.Add(new AssemblyPart(assembly));
embeddedFileProviders.Add(new EmbeddedFileProvider(assembly));
Modules.Assemblies.Add(assembly);
}
var compositeFileProvider = new CompositeFileProvider(embeddedFileProviders);
mvcBuilder.Services.AddSingleton<IFileProvider>(compositeFileProvider);
});
return mvcBuilder;
}
我也没有使用
mvcBuilder.Services.Configure<RazorViewEngineOptions>(o =>
{
o.FileProviders.Add(compositeFileProvider);
});
因为这根本不起作用,甚至没有调用o.FileProviders.Add(compositeFileProvider)动作。
当我注入IFileProvider时找到所有嵌入式文件提供程序,但是当我运行_fileProvider.GetDirectoryContents(“”)时找不到任何文件;
有人知道为什么吗?
答案 0 :(得分:3)
所以我弄清楚为什么它没有返回任何东西...... 在创建新的EmbeddedFileProvider时,我似乎没有设置baseNameSpace参数。傻啊。 但是有很多例子没有设置这个并且它有效。 希望如果他们遇到这个问题,这会帮助其他人。
答案 1 :(得分:1)
还要关注项目根命名空间设置。我的情况恰恰相反 - 我复制粘贴了一个项目文件,它没有保留上一个项目的命名空间设置。这是因为我没有在<RootNamespace>YourNameSpaceNameHere</RootNamespace>
设置中明确设置.csproj
(嵌套在顶部的<PropertyGroup>
块下面),因此它将我的文件名作为命名空间!找到我的代码正确地设置了baseNameSpace
参数,但项目将文件存储在不同的命名空间下,这是一个非常“困难”的时刻,并且浪费了很多时间! (您可以在任何文本编辑器中打开DLL,滚动到底部,您应该能够轻松地确定嵌入的文本以进行验证)。它就在那里,没找到。如果有人这样做,你也可以使用{Assembly}.GetManifestResourceNames()
转储所有文件,并确保你的名字是正确的。
答案 2 :(得分:1)
在我的情况下,我有“。” (句点)在资源文件名中。
答案 3 :(得分:0)
导致此问题的另一个根本原因。我们已经将构建代理从windows
迁移到linux
,而后者的 FS区分大小写可以解决这个问题-它没有发现嵌入式资源:
<EmbeddedResource Include="swagger\ui\*" />
因为在文件系统上,我们有 S wagger \ ui \
因此@(EmbeddedResource)
路径必须与文件系统路径相同:
<EmbeddedResource Include="Swagger\ui\*" />
(或重命名文件/目录以匹配@(EmbeddedResource)
。
答案 4 :(得分:0)
我在ASPNET Core 3.0项目中遇到此错误,该项目的外部类库中已正确嵌入了文件,但是Web应用程序在运行时找不到它们。事实证明,我从Internet复制的示例提供了一个名称空间,并且我复制了该 example 名称空间而未考虑其含义...
经过一番研究,我可以使用我自己的类库定义的正确根名称空间来修复它:
var embeddedFileProvider =
new Microsoft.Extensions.FileProviders
.EmbeddedFileProvider(assembly, "ViewComponentLibrary");
更改为
var embeddedFileProvider =
new Microsoft.Extensions.FileProviders
.EmbeddedFileProvider(assembly, "MyProjectLibrary");