为什么在调用 GetManifestResourceNames 时,GetManifestResourceStream
本文关键字:GetManifestResourceStream GetManifestResourceNames 调用 为什么 | 更新日期: 2023-09-27 18:35:04
我有一个Web应用程序项目。 我生成了 DLL 并将其导入到另一个项目中。 我实现了VirtualPathProvider
.
我关注了这个网站:http://support.microsoft.com/kb/910441/en-us?spid=8940&sid=global,一切正常,直到我添加另一个网站管理员。
- 我添加了
site_export.master
并将其生成操作更改为"嵌入资源"。 - 我更改了页面以使用新的网站母版。
-
GetManifestResourceStream()
加载site_export.master
时返回null
。 - 我打电话给
GetManifestResourceNames()
检查 DLL 中是否存在site_export.master
并且确实存在。 它在列表中。所有命名空间都匹配。我没有在这里列出名称空间。
为什么GetManifestResourceStream()
无法加载我的新site_export.master
? 它加载site.master
很好。 我知道我的 DLL 已加载,因为我可以看到 DLL 中的其他文件。
请记住以下问题...
第 1 步。将生成操作设置为嵌入的资源,请参见
C#的GetManifestResourceStream Gotcha
第 2 步。使用 namespace.resourcename
查看 GetManifestResourceStream() 返回 null ?
实际上,如果访问了另一个程序集中的私有资源,并且调用方没有带有 ReflectionPermissionFlag.MemberAccess
标志的ReflectionPermission
,则此方法返回 null。
侧面提示。若要确保您位于正确的程序集中并使用正确的名称,请执行以下操作: 转储并评估目标程序集中的所有可用资源
string[] names = assembly.GetManifestResourceNames();
(就我而言,我误用了另一个程序集中的命名空间)
我这样做是为了让它工作:
步骤1:选择资源(在我的例子中为CRDF.xsl),然后右键单击>属性。将"构建操作"设置为"嵌入式资源",将"逻辑名称"设置为您选择的名称,例如 CRDFXSL。
第 2 步:像这样更改源代码:
Assembly _assembly;
_assembly = Assembly.GetExecutingAssembly();
xslStream = _assembly.GetManifestResourceStream("CRDFXSL");
_xmlReader = XmlReader.Create(xslStream);
因此,一切都变得嗖嗖嗖嗖
和警告:如果项目文件中的"程序集名称"和"默认命名空间"不匹配,则 GetManifestResourceStream 也将返回 null。GetManifestResourceNames 仍返回程序集的名称,但在加载期间,清单将不起作用。
试试这个:
Dim ctx As Windows.ApplicationModel.Resources.Core.ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
ctx.Languages = {Globalization.CultureInfo.CurrentUICulture.Name}
Dim rmap As Windows.ApplicationModel.Resources.Core.ResourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap
Dim res = rmap.GetValue("Assets/sample.png", ctx)
Dim resFile = Await res.GetValueAsFileAsync
Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap
列出所有资源。