Не удается найти встроенный ресурс с помощью GetManifestResourceStream

в настоящее время я работаю над картой DLL, в которой мне понадобятся файлы изображений для каждой карты в качестве встроенного ресурса, текущий проект выглядит так:

Card images are in the Resources folder

Примечание: изображения карты (.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) регистр доменное имя ресурса, который состоит из двух частей разделенных точкой:

  1. пространство имен по умолчанию проекта, содержащего ресурс. В большинстве случаев пространство имен по умолчанию равно имени проекта.
  2. имя файла ресурсов, включая относительный путь к проекту. Все разделители каталогов должны быть заменены точками.
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().

Не забудьте указать в каждом файле Действие Сборки: Встроенный Ресурс и создайте сборку хотя бы один раз, чтобы внедрить файлы.

Я не уверен, но я думаю, что имена файлов, вы должны использовать следуйте схеме (?.


Я хотел бы получить доступ к моим изображениям из свойств.Ресурсы строго типизированы.

для этого щелкните правой кнопкой мыши на корне проекта и выберите Свойства, затем откройте вкладку ресурсы и перетащите изображения здесь (вы можете выбрать их из папки проекта под названием ресурсы).