Почему GetManifestResourceStream возвращает значение null, пока имя ресурса существует при вызове GetManifestResourceNames?
У меня есть проект веб-приложения. Я создал DLL и импортировал его в другой проект. Я реализовал VirtualPathProvider
.
Я следил за этим веб-сайтом: http://support.microsoft.com/kb/910441/en-us?spid=8940&sid=global, и все работает, пока я не добавлю другого хозяина сайта.
- Я добавил
site_export.master
и изменил его действие сборки на встроенный ресурс.
- Я изменил свою страницу, чтобы использовать новый мастер сайта.
-
GetManifestResourceStream()
возвращает null
при загрузке site_export.master
.
- Я вызываю
GetManifestResourceNames()
, чтобы проверить, существует ли site_export.master
в DLL. Это в списке. Все пространства имен совпадают. Я не перечислял пространство имен здесь.
Почему нельзя GetManifestResourceStream()
загружать мой новый site_export.master
? Он очень хорошо нагружает site.master
. Я знаю, что моя DLL загружена, потому что я могу видеть другие файлы в DLL.
Ответы
Ответ 1
Помните следующие проблемы...
Шаг 1. Установите действие, установленное для встроенного ресурса, см.
С# s GetManifestResourceStream Gotcha
Шаг 2. Используйте namespace.resourcename
см. GetManifestResourceStream() возвращает null?
Фактически, этот метод возвращает значение null, если доступ к частному ресурсу в другой сборке и вызывающий объект не имеет ReflectionPermission
с флагом ReflectionPermissionFlag.MemberAccess
.
Ответ 2
Side-подсказка. Чтобы убедиться, что вы находитесь в правильной сборке и с правильным именем: дамп и оцените все ресурсы, доступные в вашей целевой сборке
string[] names = assembly.GetManifestResourceNames();
(в моем случае я неправильно использовал пространство имен из другой сборки)
Ответ 3
Я сделал это, чтобы он работал:
Шаг 1: Выберите ресурс (CRDF.xsl в моем случае) и щелкните правой кнопкой мыши > Свойства.
Установите Build Action на "EmbeddedResource" и логическое имя по вашему выбору, например. CRDFXSL.
Шаг 2: Измените исходный код следующим образом:
Assembly _assembly;
_assembly = Assembly.GetExecutingAssembly();
xslStream = _assembly.GetManifestResourceStream("CRDFXSL");
_xmlReader = XmlReader.Create(xslStream);
Таким образом, все прошло смутно.
Ответ 4
Подсказка и предостережение:
Если "Project name" и "Default namespace" не совпадают в файле проекта, то GetManifestResourceStream вернет значение null. GetManifestResourceNames по-прежнему возвращает имена сборок, но во время загрузки манифест не будет работать.
Ответ 5
Попробуйте следующее:
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
список всех ресурсов.