System.Runtime.InteropServicesExternalException произошла в System.Drawing.dll

У меня есть встроенный ресурс размером 28 МБ, который я пытаюсь загрузить в форму "О программе".

Код формы выглядит следующим образом:

Около

private void About_Load(object sender, EventArgs e)
{
    pictureBox1.Image = EmbeddedResources.image("mygif.gif");
}

EmbeddedResources (упрощенно)

public class EmbeddedResources
{
    public static Assembly self { get { return Assembly.GetExecutingAssembly(); } }

    public static Image image(string name)
    {
        Image result = null;
        using (Stream res = self.GetManifestResourceStream("MyProject." + name))
        {
            result = Image.FromStream(res);
        }
        return result;
    }

}

У кода, похоже, нет проблем с поиском ресурса, так как result в EmbeddedResources.image() заполняется данными (не нулевыми) и строкой pictureBox1.Image = EmbeddedResources.image("mygif.gif"); в About_Load() кажется, что данные передаются без ошибок, но я получаю следующее исключение после загрузки формы на ShowDialog() метод.

Это код, который я использую (из другой формы.. Form1) загрузить и отобразить About форма.

private void button1_Click(object sender, EventArgs e)
{
    About frm = new About();
    frm.ShowDialog(this);
}

введите описание изображения здесь

Почему я получаю это исключение, и что мне нужно сделать, чтобы исправить это, чтобы мой анимированный GIF (цикл 30 секунд) мог загружаться? (это так мало, как я могу получить цикл и вычислить, используя анимированный GIF, было бы проще, чем возиться с устаревшими медиа-элементами управления activex/com или более старой платформой Directx для поддержки видео в качестве фона, а затем придется возиться с добавлением элементов управления НАД видео - большой грязный кошмар)

Трассировки стека

   at System.Drawing.Image.SelectActiveFrame(FrameDimension dimension, Int32 frameIndex)
   at System.Drawing.ImageAnimator.ImageInfo.UpdateFrame()
   at System.Drawing.ImageAnimator.UpdateFrames(Image image)
   at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

1 ответ

Решение

Хорошо, я смущен, что я не поймал это раньше. Проблема в том, что, оборачивая Stream доступ в using блок, что Stream расположен по завершении. Я видел это сделано раньше и всегда задавался вопросом о последствиях этого. Теперь я знаю последствия.

Простое исправление, не Dispose поток.

public class EmbeddedResources
{
    public static Assembly self { get { return Assembly.GetExecutingAssembly(); } }

    public static Image image(string name)
    {
        Image result = null;

        // note: typeof(EmbeddedResources).Namespace will only work if EmbeddedResources is defined in the default namespace
        Stream res = self.GetManifestResourceStream(typeof(EmbeddedResources).Namespace + "." + name);
        result = Image.FromStream(res);
        return result;
    }

}
Другие вопросы по тегам