Исключительная ситуация TargetInvocationException - c # - PullRequest
5 голосов
/ 01 марта 2012

Я действительно не могу понять, что происходит и почему это происходит
Исключение было выдано целью вызова.

код выполнялся в frm5

, тогда ошибка отображается в
Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace BlueStitch
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }
}  

это было в строке Application.Run(new frmMain());

это говорит TargetInvocationException was unhandled - Exception has been thrown by the target of an invocation.

это исключение

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: Parameter is not valid.
at System.Drawing.Image.get_FrameDimensionsList()
at System.Drawing.ImageAnimator.CanAnimate(Image image)
at System.Drawing.ImageAnimator.ImageInfo..ctor(Image image)
at System.Drawing.ImageAnimator.Animate(Image image, EventHandler onFrameChangedHandler)
at System.Windows.Forms.PictureBox.Animate(Boolean animate)
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at BlueStitch.frmStitch.backgroundWorker1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e) in C:\Users\Freddie Rosillo\Documents\Visual Studio 2008\Projects\BlueStitch\BlueStitch\BlueStitch\frmStitch.cs:line 976
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at BlueStitch.Program.Main() in C:\Users\Freddie Rosillo\Documents\Visual Studio 2008\Projects\BlueStitch\BlueStitch\BlueStitch\Program.cs:line 21

Ответы [ 5 ]

3 голосов
/ 01 марта 2012

Вы выполняете некоторый код внутри вашего конструктора frmMain, который не должен выполняться там.Переместите этот код и выполните его в событии Form Shown.

2 голосов
/ 05 октября 2013

Похоже, что вы используете BackgroundWorker для выполнения некоторой работы в фоновом потоке.Убедитесь, что вы ничего не делаете в потоке пользовательского интерфейса.Проблема исчезнет, ​​если вы временно измените код для синхронного выполнения работы?

Обратите внимание, что ArgumentException генерируется методом COM при различных обстоятельствах.Источник для SafeNativeMethods.Gdip.StatusException потенциально может выдать ArgumentException, если аргумент равен 2, 13, 14, 15, 16, 19 или 20. Есть пара других сообщений о подобных проблемах здесь и здесь .

2 голосов
/ 01 марта 2012

Я не очень увлекаюсь графикой, но ошибочная строка:

System.Drawing.Image.get_FrameDimensionsList ()

Делает несколько вызовов GDI + иКажется, нужны определенные значения для FrameDimensionsCount изображения ... Вы имеете дело с анимированными GIF-файлами?Или TIFFs?

Ознакомьтесь с документами для GdipImageGetFrameDimensionsCount и посмотрите, нет ли там прутьев.Декомпилированный сбойный геттер ниже:

[Browsable(false)]
    public Guid[] FrameDimensionsList
    {
      get
      {
        int count;
        int frameDimensionsCount = SafeNativeMethods.Gdip.GdipImageGetFrameDimensionsCount(new HandleRef((object) this, this.nativeImage), out count);
        if (frameDimensionsCount != 0)
          throw SafeNativeMethods.Gdip.StatusException(frameDimensionsCount);
        if (count <= 0)
          return new Guid[0];
        int num1 = Marshal.SizeOf(typeof (Guid));
        IntPtr num2 = Marshal.AllocHGlobal(num1 * count);
        if (num2 == IntPtr.Zero)
          throw SafeNativeMethods.Gdip.StatusException(3);
        int frameDimensionsList = SafeNativeMethods.Gdip.GdipImageGetFrameDimensionsList(new HandleRef((object) this, this.nativeImage), num2, count);
        if (frameDimensionsList != 0)
        {
          Marshal.FreeHGlobal(num2);
          throw SafeNativeMethods.Gdip.StatusException(frameDimensionsList);
        }
        else
        {
          Guid[] guidArray = new Guid[count];
          try
          {
            for (int index = 0; index < count; ++index)
              guidArray[index] = (Guid) System.Drawing.UnsafeNativeMethods.PtrToStructure((IntPtr) ((long) num2 + (long) (num1 * index)), typeof (Guid));
          }
          finally
          {
            Marshal.FreeHGlobal(num2);
          }
          return guidArray;
        }
      }
    }
1 голос
/ 07 октября 2013

Каждое исключение в .NET попадает на строку Application.Run(new frmMain());, поскольку этот метод запускает цикл обработки сообщений и остается активным, пока окно не закрыто.

Однако ваше исключение является распространенным исключением, которое всегда выдается при воспроизведении изображенийна GDI +, и GDI обнаружил утечки памяти, которые приводят к этой ошибке, которая в конечном итоге происходит из-за ошибки больше не доступно памяти.

Я могу написать больше о вашей ошибке, как только я увижу, что вы делаете с изображениями, большинствоскорее всего, ваши воспоминания, используемые для ваших изображений, не освобождаются, что вызывает эту проблему.Эти проблемы памяти с изображениями были решены в WPF, переключение на манипуляции с изображениями в WPF не вызывает этих ошибок.Вы все еще можете использовать WPF внутри .NET Forms для обработки изображений, не вызывая ошибок памяти, и использовать Windows Forms по мере необходимости.

1 голос
/ 07 октября 2013

Когда вы пытаетесь получить свойство FrameDimensionsList из вашего frmStitch.backgroundWorker1_RunWorkerCompleted метода, оно не может найти свойство, поскольку вы находитесь вне потока BackgroundWorker. RunWorkerCompleted выполняет код обратно в исходном потоке после того, как вы закончили работу в потоке BackgroundWorker.

Обычно мы используем метод BackgroundWorker.ReportProgress для связи из потока BGW с основным потоком. Чтобы обмениваться информацией наоборот (что, по-видимому, является тем, что вы пытаетесь сделать), я хотел бы рассмотреть возможность подписки на событие в главном потоке из потока BGW, чтобы поток BGW мог обновить соответствующее свойство на основе чего-либо ты делаешь в главном потоке.

Кроме того, проверьте этот пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...