FileNotFoundException выдается, когда WinCE пытается найти текст сообщения для другого исключения в .NET CF 2.0 - PullRequest
1 голос
/ 22 марта 2012

У меня глупое приложение WinCE, где я просто пытаюсь вызвать исключение и получить сообщение об исключении из System.SR.dll, которое развертывается на устройстве.

Код, который я выбрасываю, является следующим:

TcpClient client = new TcpClient("abcd", 1234);

Но когда SocketException пытается разрешить свое сообщение, оно генерирует FileNotFoundException со следующей трассировкой:

в System.Reflection.Assembly.InternalGetSatellAssembly () в System.Reflection.Assembly.GetSatellAssembly () в System.Resources.ResourceManager.InternalGetResourceSet () в System.Resources.ResourceManager.GetString () в System.Resources.ResourceManager.GetString () в System.SRSupport.HasString () в System.SRSupport.HasString () в System.SR.HasString () в System.Net.Sockets.SocketException.makeMessage () в System.Net.Sockets.SocketException..ctor () в System.Net.Dns.ResolveInternal () в System.Net.Dns.GetHostEntry () в System.Net.Sockets.TcpClient.Connect () в System.Net.Sockets.TcpClient..ctor () в WinCeMessage.Com.SocketBlaster.Blast () в WinCeMessage.Form1.button1_Click () в System.Windows.Forms.Control.OnClick () в System.Windows.Forms.Button.OnClick () в System.Windows.Forms.ButtonBase.WnProc () в System.Windows.Forms.Control._InternalWnProc () в Microsoft.AGL.Forms.EVL.EnterMainLoop () в System.Windows.Forms.Application.Run () в WinCeMessage.Program.Main ()

(Полагаю) Файл, в котором хранятся эти сообщения, - это файл System.SR.dll, который развертывается на устройстве при запуске его в Visual Studio. Я установил эмулятор и проверил наличие файла.

Это код из System.SR.dll, выдающий исключение:

internal Assembly InternalGetSatelliteAssembly(CultureInfo culture, Version version, bool throwOnFileNotFound)
{
    if (culture != null)
    {
        Assembly assembly = null;
        AssemblyName name = this.GetName();
        if (name != null)
        {
            name.Version = version;
            name.CultureInfo = culture;
            if (name.Name != null)
            {
                name.Name = string.Concat(name.Name, ".resources");
                name.CodeBase = null;
            }
            try
            {
                StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
                assembly = Assembly.BCL_System_Reflection_Assembly_LoadFromName(name, false, null, ref stackCrawlMark);
            }
            catch (IOException oException)
            {
                assembly = null;
            }
            if (assembly != null)
            {
                if (assembly == this)
                {
                    if (!throwOnFileNotFound)
                    {
                        return null;
                    }
                    else
                    {
                        throw new FileNotFoundException();
                    }
                }
            }
            else
            {
                if (!throwOnFileNotFound)
                {
                    return null;
                }
                else
                {
                    throw new FileNotFoundException();
                }
            }
        }
        return assembly;
    }
    else
    {
        throw new ArgumentNullException();
    }
}

Ответы [ 2 ]

1 голос
/ 28 марта 2012

В итоге я нашел новое решение, которое почему-то казалось сломанным.

0 голосов
/ 22 марта 2012

Вы хотите сказать, что метод TcpClient() выдает исключение, и вы не можете его перехватить?

IntelliSense VS2008 показывает только 3 исключения, которые генерируются при создании нового экземпляра TcpClient():

try {
  TcpClient client = new TcpClient("abcd", 1234);
} catch (ArgumentNullException) {
  Console.WriteLine("ArgumentNullException");
} catch (ArgumentOutOfRangeException) {
  Console.WriteLine("ArgumentOutOfRangeException");
} catch (SocketException) {
  Console.WriteLine("SocketException");
}

Поместите точку останова в ваше исключение.

Однако я предполагаю, что номер вашего порта находится вне диапазона.

...