Не удается найти встроенный ресурс с помощью GetManifestResourceStream
в настоящее время я работаю над картой DLL, в которой мне понадобятся файлы изображений для каждой карты в качестве встроенного ресурса, текущий проект выглядит так:
Примечание: изображения карты (.png) находятся в папке Resources.
код, который я пробовала и единственный код, который я могу найти, это:
Assembly _assembly;
Stream _imageStream;
private Image img;
public Image Img
{
get
{
return img;
}
}
public Kaart() : this(5, "Spades") { }
public Kaart(int val, string s)
{
this.KaartWaarde = val;
this.Figuur = s;
this._imageStream = imgS();
this.img = new Image(_imageStream);
}
private Stream imgS()
{
try
{
_assembly = Assembly.GetExecutingAssembly();
Stream s = _assembly.GetManifestResourceStream(string.Format("{0}{1}.png", this.kaartWaarde, this.figuur.Substring(0, 1)));
if (s != null)
return s;
else
return null ;
}
catch
{
throw new Exception("Kaart kan niet geladen worden.");
}
}
единственное исключение, которое я, кажется, получаю, является исключением в создании Kaart
объект, для которого код вот здесь:
Kaart k = null;
try
{
k = new Kaart();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); //This MessageBox is being shown
}
ImageSourceConverter c = new ImageSourceConverter();
testBox.Source = (ImageSource)c.ConvertFrom(k.Img);
исключение, пойманное и показанное с помощью MessageBox, выглядит следующим образом:
значение 'null' недопустимо для 'stream'.
наблюдая за моими переменными во время выполнения кода, я заметил как-то строку
Stream s = _assembly.GetManifestResourceStream(string.Format("{0}{1}.png", this.kaartWaarde, this.figuur.Substring(0, 1)));
не удается найти изображение, даже при использовании формата Kaarten.{0}{1}.png
это просто заставляет меня задуматься, делаю ли я что-то неправильно здесь или использую неправильно синтаксис. Есть идеи?
изменить:
Изображения теперь загружаются правильно, однако ImageSourceConverter все еще бросает NullReferenceException
создание карты и загрузки Stream
объекты (и выгрузка их в Image
object) теперь работают нормально, насколько я могу судить, однако при попытке фактически показать изображения в моем элементе управления WPF Image с помощью кода ниже создается исключение NullRefException.
Kaartspel kaarten = new Kaartspel();
Kaart k = kaarten.kaarten[7];
ImageSourceConverter c = new ImageSourceConverter();
testBox.Source = (ImageSource)c.ConvertFrom(k.Img); //Exception here
5 ответов
, который Image
класс содержит конструктор, который принимает поток?
думаю, вы могли бы использовать System.Drawing.Image.FromStream
и System.Drawing.Bitmap
. Затем вы можете использовать следующее:
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
чтобы получить ресурс, вы должны использовать GetManifestResourceStream(string)
регистр доменное имя ресурса, который состоит из двух частей разделенных точкой:
- пространство имен по умолчанию проекта, содержащего ресурс. В большинстве случаев пространство имен по умолчанию равно имени проекта.
- имя файла ресурсов, включая относительный путь к проекту. Все разделители каталогов должны быть заменены точками.
resource_name ::= default_namespace '.' full_file_name
full_file_name ::= (directory_name '.')* file_name
в вашей дело:
string name = string.Format("Kaarten.Resources.{0}{1}.png", this.kaartWaarde, this.figuur.Substring(0, 1)));
Stream stream = _assembly.GetManifestResourceStream(name);
другой способ получить ресурс-использовать GetManifestResourceStream(Type, string)
. В этом случае имя относится к пространству имен указанного типа (MSDN см. Примечания).
string name = string.Format("Resources.{0}{1}.png", this.kaartWaarde, this.figuur.Substring(0, 1)));
Stream stream = _assembly.GetManifestResourceStream(typeof(Kaart), name);
_assembly.GetManifestResourceStream("{ProjectName}.resources.{ImageName.ext}");
это загрузит изображение правильно.
ресурсы != ресурсы, это приведет к ошибке.
самый простой способ решить эту проблему-получить список внедренных имен ресурсов:
string[] result = myAssembly.GetManifestResourceNames();
запустите это в модульном тесте или создайте отдельное консольное приложение, которое ссылается на сборку, выполните typeof().Собрание.GetManifestResourceNames().
Не забудьте указать в каждом файле Действие Сборки: Встроенный Ресурс и создайте сборку хотя бы один раз, чтобы внедрить файлы.
Я не уверен, но я думаю, что имена файлов, вы должны использовать следуйте схеме (?.
Я хотел бы получить доступ к моим изображениям из свойств.Ресурсы строго типизированы.
для этого щелкните правой кнопкой мыши на корне проекта и выберите Свойства, затем откройте вкладку ресурсы и перетащите изображения здесь (вы можете выбрать их из папки проекта под названием ресурсы).