您在Program.cs中为C#添加了哪些常用例程?

时间:2009-11-03 14:42:33

标签: c# .net

我对您在创建.NET项目时可能在Program.cs中使用的任何常见例程/过程/方法感兴趣。例如,我通常在桌面应用程序中使用以下代码,以便轻松升级,单实例执行以及友好而简单地报告未捕获的系统应用程序错误。


    using System;
    using System.Diagnostics;
    using System.Threading;
    using System.Windows.Forms;

    namespace NameoftheAssembly
    {
        internal static class Program
        {
            /// <summary>
            /// The main entry point for the application. Modified to check for another running instance on the same computer and to catch and report any errors not explicitly checked for.
            /// </summary>
            [STAThread]
            private static void Main()
            {
                //for upgrading and installing newer versions
                string[] arguments = Environment.GetCommandLineArgs();
                if (arguments.GetUpperBound(0) > 0)
                {
                    foreach (string argument in arguments)
                    {
                        if (argument.Split('=')[0].ToLower().Equals("/u"))
                        {
                            string guid = argument.Split('=')[1];
                            string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
                            var si = new ProcessStartInfo(path + "\\msiexec.exe", "/x" + guid);
                            Process.Start(si);
                            Application.Exit();
                        }
                    }
                    //end of upgrade
                }
                else
                {
                    bool onlyInstance = false;
                    var mutex = new Mutex(true, Application.ProductName, out onlyInstance);
                    if (!onlyInstance)
                    {
                        MessageBox.Show("Another copy of this running");
                        return;
                    }
                    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                    Application.ThreadException += ApplicationThreadException;
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form1());
                }
            }

            private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                try
                {
                    var ex = (Exception) e.ExceptionObject;
                    MessageBox.Show("Whoops! Please contact the developers with the following"
                                    + " information:\n\n" + ex.Message + ex.StackTrace,
                                    " Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                catch (Exception)
                {
                    //do nothing - Another Exception! Wow not a good thing.
                }
                finally
                {
                    Application.Exit();
                }
            }

            public static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
            {
                try
                {
                    MessageBox.Show("Whoops! Please contact the developers with the following"
                                    + " information:\n\n" + e.Exception.Message + e.Exception.StackTrace,
                                    " Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
                catch (Exception)
                {
                    //do nothing - Another Exception! Wow not a good thing.
                }
            }
        }
    }

我发现这些例程非常有用。您在Program.cs中发现了哪些有用的方法?

5 个答案:

答案 0 :(得分:5)

我尽量避免在Program.cs文件中放置任何重要内容。我为一个简单的控制台应用程序编写的任何东西都可能有一天被移动到类库中,因此我将为实际的程序逻辑构建一个单独的类。

也就是说,有一些我一遍又一遍使用的通用代码。主要的是使用Trace类来处理控制台输出,所以我不必更改应用程序本身中的任何重要代码,以便在不可避免地转换到类库或gui app时将内容重定向到日志文件或其他地方。发生:

using System;
using System.Diagnostics;

public static void Main(string[] args)
{
    Trace.Listeners.Add(new ConsoleTraceListener());
    Trace.WriteLine("Program Started - " + DateTime.Now.ToString());Trace.WriteLine("");

    //Call into a separate class or method for the actual program logic
    DoSomething(); //I'll use Trace for output in here rather than Console

    Trace.WriteLine("");Trace.WriteLine("Program Finished - " + DateTime.Now.ToString());

    Console.Write("Press a key to exit...");
    Console.ReadKey(true);
    Console.WriteLine();
}

答案 1 :(得分:2)

对于参数解析,Novell Options类是我见过的最好的(通过"Best way to parse command line arguments in C#")。我还adapted it用于交互式控制台应用程序,用于不仅运行和退出的程序。

以下是Options类的示例:

static void Main(string[] args)
{
    var p = new new OptionSet ()
         .Add ("v|verbose", v=> setVerbose())
         .Add ("h|?|help",  v=> showHelp())
         .Add ("n|name=", v=> showName(v));

    p.Parse (args);
}

答案 2 :(得分:1)

我通常有一个非常小的Main函数调用另一个函数(例如Start) - 这样,如果缺少某个程序集并且Start不能被JIT,我可以捕获TypeLoadException并显示一个人类可读的错误消息。

答案 3 :(得分:1)

我们通常使用main进行基本的命令行解析,崩溃处理设置,许可证检查和主窗体的创建(假设它是一个Windows应用程序而不是控制台应用程序)。

但是,大部分功能都是由主要实例化和调用的其他对象处理的。

答案 4 :(得分:0)

我唯一可以进入每个程序的代码是我的异常处理程序:

一开始:

#If Not Debug Then
        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf Me.Application_UnhandledException
        AddHandler Application.ThreadException, AddressOf Me.Application_ThreadException
#End If

Private Sub Application_UnhandledException(ByVal sender As Object, ByVal e As System.UnhandledExceptionEventArgs)
    Me.UnhandledExceptionLog(TryCast(e.ExceptionObject, Exception).Message, New StackTrace(TryCast(e.ExceptionObject, Exception), True), e.ExceptionObject)
End Sub
Private Sub Application_ThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
    Me.UnhandledExceptionLog(e.Exception.Source & Environment.NewLine & e.Exception.Message & Environment.NewLine & e.Exception.StackTrace, New StackTrace(e.Exception, True), e.Exception)
End Sub

Public Sub UnhandledExceptionLog(ByVal message As String, ByVal stack As StackTrace, ByVal ex As Object)
    ' write the exception details to a log and inform the user the he screwed something ;) '
End Sub

这将捕获我错过的每个异常,并将其写入我自己的日志(询问客户端所说的错误消息实际上不是最明智的事情......)。

巴比