Я предположил, что, поскольку я включил изображения напрямую в свой проект, я мог их непосредственно прочитать.Но благодаря ответу Джека я смог выяснить, что они скрыты внутри «файла ресурсов» с именем «ProgramName.g.resources» внутри сборки.Чтобы прочитать изображение, необходимо сначала загрузить файл ресурса, а затем выполнить поиск файла изображения в файле ресурса.
ResourceSet.GetObject
чувствительно к регистру, но путь к изображению и имя файла были преобразованы в нижний регистр дляпо какой-то причине, поэтому я называю ToLowerInvariant
по пути.Вот мое решение:
private Stream GetGlobalResourceByPath(Assembly assembly, string path)
{
string name = assembly.GetManifestResourceNames().Where(n => n.EndsWith(".g.resources")).First();
Stream outerStream = assembly.GetManifestResourceStream(name);
ResourceSet resources = new ResourceSet(outerStream);
return resources.GetObject(path.ToLowerInvariant()) as UnmanagedMemoryStream;
}
Я не уверен, насколько дорого построить ResourceSet
.Если это дорого, и вы хотите получить несколько ресурсов, то вам следует кэшировать и повторно использовать объект ResourceSet
.
Пожалуйста, оставьте сообщение, если вы знаете, почему изображения оказываются внутри * .g.файл ресурсов.Visual Studio выбрал это имя?Теоретически возможно поместить изображения непосредственно в сборку, или сборки могут содержать только «ResourceSets»?