it-swarm.com.de

Wie dieses System.IO.FileNotFoundException auflösen

  • Der Fehler tritt nur in der Produktion auf (nicht beim Debuggen).
  • Der Fehler tritt nur bei der ersten Anwendung auf, die nach der Windows-Anmeldung ausgeführt wird. 
  • Der Fehler tritt auf, wenn wir auf BtnUseDesktop klicken und somit das Ereignis BtnUseDesktop_Click (unten) auslösen.
  • Der Event Viewer-Stack beginnt mit der Methode The.Application.Name.Main () ...
  • unser Code verfügt jedoch nicht über diese Methode (es ist eine WPF-Anwendung).

Ereignisanzeige

 Application: The.Application.Name.exe
 Framework Version: v4.0.30319
 Description: The process was terminated due to an unhandled exception.
 Exception Info: System.IO.FileNotFoundException
 Stack:

   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(
      System.Object, System.Delegate, System.Object, Int32, System.Delegate)

   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(
      System.Windows.Threading.DispatcherPriority, System.TimeSpan, 
      System.Delegate, System.Object, Int32)

   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)

   at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)

   at System.Windows.Threading.Dispatcher.PushFrameImpl(
      System.Windows.Threading.DispatcherFrame)

   at System.Windows.Threading.Dispatcher.PushFrame(
      System.Windows.Threading.DispatcherFrame)

   at System.Windows.Threading.Dispatcher.Run()

   at System.Windows.Application.RunDispatcher(System.Object)

   at System.Windows.Application.RunInternal(System.Windows.Window)

   at System.Windows.Application.Run(System.Windows.Window)

   at The.Application.Name.Main()

BtnUseDesktop_Click

private void BtnUseDesktop_Click(object sender, RoutedEventArgs e)
{
    AvSwitcher switcher = new AvSwitcher();
    this.RunAsyncTask(() => 
        switcher.SwitchToDesktop(this.windowSyncSvc.ActiveLyncWindowHandle));
}

Der AvSwitcher, in den das Click-Ereignis einlädt

public class AvSwitcher
{
    private DeviceLocationSvc deviceLocationSvc;
    private UIAutomationSvc uiAutomationSvc;
    private WindowMovingSvc windowMovingSvc;
    private ManualResetEvent manualResetEvent;
    private Modality audioVideo;
    public static bool IsSwitching { get; set; }

    public AvSwitcher()
    {            
        this.deviceLocationSvc = new DeviceLocationSvc();
        this.uiAutomationSvc = new UIAutomationSvc();
        this.windowMovingSvc = new WindowMovingSvc();
    }

    public void SwitchToDesktop(IntPtr activeLyncConvWindowHandle)
    {
        this.BeginHold(DeviceLocation.Desktop, activeLyncConvWindowHandle);
    }

    public void SwitchToWall(IntPtr activeLyncConvWindowHandle)
    {
        this.BeginHold(DeviceLocation.Wall, activeLyncConvWindowHandle);
    }

    private Conversation GetLyncConversation()
    {
        Conversation conv = null;
        if (LyncClient.GetClient() != null)
        {
            conv = LyncClient.GetClient().ConversationManager.Conversations.FirstOrDefault();
        }

        return conv;
    }

    private void BeginHold(DeviceLocation targetLocation, IntPtr activeLyncConvWindowHandle)
    {
        AvSwitcher.IsSwitching = true;

        // make sure the class doesn't dispose of itself
        this.manualResetEvent = new ManualResetEvent(false);

        Conversation conv = this.GetLyncConversation();
        if (conv != null)
        {
            this.audioVideo = conv.Modalities[ModalityTypes.AudioVideo];
            ModalityState modalityState = this.audioVideo.State;

            if (modalityState == ModalityState.Connected)
            {
                this.HoldCallAndThenDoTheSwitching(targetLocation, activeLyncConvWindowHandle);
            }
            else
            {
                this.DoTheSwitching(targetLocation, activeLyncConvWindowHandle);
            }
        }
    }

    private void HoldCallAndThenDoTheSwitching(
        DeviceLocation targetLocation, 
        IntPtr activeLyncConvWindowHandle)
    {
        try
        {
            this.audioVideo.BeginHold(
                this.BeginHold_callback,
                new AsyncStateValues()
                {
                    TargetLocation = targetLocation,
                    ActiveLyncConvWindowHandle = activeLyncConvWindowHandle
                });
            this.manualResetEvent.WaitOne();
        }
        catch (UnauthorizedAccessException)
        {
            // the call is already on hold
            this.DoTheSwitching(targetLocation, activeLyncConvWindowHandle);
        }
    }

    private void BeginHold_callback(IAsyncResult ar)
    {
        if (ar.IsCompleted)
        {
            DeviceLocation targetLocation = ((AsyncStateValues)ar.AsyncState).TargetLocation;
            IntPtr activeLyncConvWindowHandle = 
                ((AsyncStateValues)ar.AsyncState).ActiveLyncConvWindowHandle;
            this.DoTheSwitching(targetLocation, activeLyncConvWindowHandle);
        }

        Thread.Sleep(2000); // is this necessary
        this.audioVideo.BeginRetrieve(this.BeginRetrieve_callback, null);
    }

    private void DoTheSwitching(DeviceLocation targetLocation, IntPtr activeLyncConvWindowHandle)
    {
        DeviceLocationSvc.TargetDevices targetDevices = 
            this.deviceLocationSvc.GetTargetDevices(targetLocation);

        this.SwitchScreenUsingWinApi(targetDevices.Screen, activeLyncConvWindowHandle);
        this.SwitchVideoUsingLyncApi(targetDevices.VideoDevice);
        this.SwitchAudioUsingUIAutomation(
            targetDevices.MicName, 
            targetDevices.SpeakersName, 
            activeLyncConvWindowHandle);

        AvSwitcher.IsSwitching = false;
    }

    private void SwitchScreenUsingWinApi(Screen targetScreen, IntPtr activeLyncConvWindowHandle)
    {
        if (activeLyncConvWindowHandle != IntPtr.Zero)
        {
            WindowPosition wp = 
                this.windowMovingSvc.GetTargetWindowPositionFromScreen(targetScreen);
            this.windowMovingSvc.MoveTheWindowToTargetPosition(activeLyncConvWindowHandle, wp);
        }
    }

    private void SwitchVideoUsingLyncApi(VideoDevice targetVideoDevice)
    {
        if (targetVideoDevice != null)
        {
            LyncClient.GetClient().DeviceManager.ActiveVideoDevice = targetVideoDevice;
        }
    }

    private void SwitchAudioUsingUIAutomation(
        string targetMicName, 
        string targetSpeakersName, 
        IntPtr activeLyncConvWindowHandle)
    {
        if (targetMicName != null && targetSpeakersName != null)
        {
            AutomationElement lyncConvWindow = 
                AutomationElement.FromHandle(activeLyncConvWindowHandle);

            AutomationElement lyncOptionsWindow =
                this.uiAutomationSvc.OpenTheLyncOptionsWindowFromTheConvWindow(lyncConvWindow);

            this.uiAutomationSvc.SelectTheTargetMic(lyncOptionsWindow, targetMicName);

            this.uiAutomationSvc.SelectTheTargetSpeakers(lyncOptionsWindow, targetSpeakersName);

            this.uiAutomationSvc.InvokeOkayButton(lyncOptionsWindow);
        }
    }

    private void BeginRetrieve_callback(IAsyncResult ar)
    {
        this.audioVideo.EndRetrieve(ar);
        this.manualResetEvent.Set(); // allow the program to exit
    }

    private class AsyncStateValues
    {
        internal DeviceLocation TargetLocation { get; set; }

        internal IntPtr ActiveLyncConvWindowHandle { get; set; }
    }
}
7
Shaun Luttin

Ich hasse es, auf das Offensichtliche hinzuweisen, aber System.IO.FileNotFoundException bedeutet, dass das Programm die angegebene Datei nicht gefunden hat. Sie müssen also überprüfen, nach welcher Datei Ihr Code in der Produktion gesucht wird. 

Versuchen Sie die folgenden Techniken, um zu sehen, nach welcher Datei Ihr Programm in der Produktion sucht (sehen Sie sich die FileName-Eigenschaft der Ausnahme an):

Sehen Sie sich dann das Dateisystem auf dem Computer an und prüfen Sie, ob die Datei vorhanden ist. Am wahrscheinlichsten ist es, dass es nicht existiert.

7
mason

Nach dem Veröffentlichen einer ClickOnce-Anwendung bin ich auf eine ähnliche Situation gestoßen, und einer meiner Kollegen in einer anderen Domain berichtete, dass er nicht gestartet werden konnte.

Um herauszufinden, was los war, habe ich eine try catch -Anweisung in der MainWindow-Methode hinzugefügt, wie @BradleyDotNET in einem Kommentar zum ursprünglichen Beitrag erwähnt und dann erneut veröffentlicht. 

public MainWindow()
{
    try
    {
        InitializeComponent();
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.ToString());
    }
}

Dann berichtete mir mein Kollege das Ausnahmedetail, und es war eine fehlende Referenz einer Drittanbieter-Framework-DLL-Datei.

Die Referenz und das Problem wurden hinzugefügt.

3
usefulBee

Dieser Fehler hat mich mehr als einmal in die Irre geführt. Nach stundenlangem Googlen, Aktualisieren von Nuget-Paketen, Versionsüberprüfung und nach einer vollständig aktualisierten Lösung erkenne ich einen völlig gültigen, einfacheren Grund für den Fehler.

Wenn in einer Thread-Threation (z. B. UI Dispatcher.Invoke), wird System.IO.FileNotFoundException ausgelöst, wenn die Thread-Manager-DLL (Datei) nicht zurückgegeben wird. Wenn also der Haupt-UI-Thread A die System-Thread-Manager-DLL B und B den Thread-Code C aufruft, C jedoch aus einem nicht zusammenhängenden Grund (wie z. B. null Referenz wie in meinem Fall) auslöst, kehrt C nicht zurück, B jedoch nicht nicht zurückgeben, und A beschuldigt nur B mit FileNotFoundException für den Verlust ...

Bevor Sie den DLL-Versionspfad hinuntergehen ... Überprüfen Sie, ob sich der Thread-Code nicht löst.

2
Russ Ebbing

Alle Referenzen sorgfältig prüfen

  • Die Version bleibt auf dem Zielcomputer und auf dem lokalen Computer gleich
  • Wenn von GAC auf Assembly verwiesen wird, stellen Sie sicher, dass die richtige Version geladen ist

Für mich ist das Reinigen der gesamten Lösung durch manuelles Löschen, erneutes Aktualisieren (Entfernen und Hinzufügen) von Referenzen mit Version synchron mit Zielcomputer und anschließendes Erstellen mit Copy Local> False für GAC-Assemblys das Problem.

0
vCillusion