58

我有一个 Web 应用程序项目。我生成了 DLL 并将其导入另一个项目。我实施了VirtualPathProvider.

我关注了这个网站: http: //support.microsoft.com/kb/910441/en-us ?spid=8940&sid=global ,一切正常,直到我添加另一个站点管理员。

  1. 我添加site_export.master并将其构建操作更改为嵌入式资源。
  2. 我更改了我的页面以使用新的站点管理员。
  3. GetManifestResourceStream()null加载时返回site_export.master
  4. 我打电话GetManifestResourceNames()来检查site_export.masterDLL中是否存在,它确实存在。它在列表中。所有名称空间都匹配。我没有在这里列出名称空间。

为什么不能GetManifestResourceStream()加载我的新的site_export.master?它加载site.master得很好。我知道我的 DLL 已加载,因为我可以看到 DLL 中的其他文件。

4

5 回答 5

97

记住以下问题...

步骤 1。将操作设置为嵌入式资源,请参阅

C# 的 GetManifestResourceStream 问题

步骤 2。使用namespace.resourcenameGetManifestResourceStream() 返回 null ?

实际上,如果访问另一个程序集中的私有资源并且调用者没有ReflectionPermission带有ReflectionPermissionFlag.MemberAccess标志,则此方法返回 null。

于 2012-05-27T09:53:53.583 回答
85

侧面提示。为了确保您在正确的程序集中并具有正确的名称:转储并评估目标程序集中的所有可用资源

string[] names = assembly.GetManifestResourceNames();

(就我而言,我滥用了另一个程序集中的命名空间)

于 2014-03-16T21:16:54.940 回答
11

我这样做是为了让它工作:

第 1 步:选择资源(在我的例子中为 CRDF.xsl)并右键单击 > 属性。将 Build Action 设置为“EmbeddedResource”,将 Logical Name 设置为您选择的名称,例如 CRDFXSL。

第 2 步:更改您的源代码,如下所示:

Assembly _assembly;
  _assembly = Assembly.GetExecutingAssembly();         
  xslStream = _assembly.GetManifestResourceStream("CRDFXSL");
  _xmlReader = XmlReader.Create(xslStream);

因此,一切都很顺利..

于 2016-10-21T07:07:25.800 回答
4

提示和警告:如果项目文件中的“程序集名称”和“默认命名空间”不匹配,则 GetManifestResourceStream 也将返回 null。GetManifestResourceNames 仍然返回程序集的名称,但在加载清单期间将不起作用。

于 2016-03-08T11:56:27.617 回答
0

尝试这个:

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列出所有资源。

于 2014-03-31T17:19:45.897 回答