Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你在你的程序中放了什么常见的例程#_C#_.net - Fatal编程技术网

C# 你在你的程序中放了什么常见的例程#

C# 你在你的程序中放了什么常见的例程#,c#,.net,C#,.net,我对创建.NET项目时在Program.cs中可能使用的任何常见例程/过程/方法感兴趣。例如,我通常在我的桌面应用程序中使用以下代码,以便轻松升级、单实例执行和友好、简单地报告未捕获的系统应用程序错误 使用系统; 使用系统诊断; 使用系统线程; 使用System.Windows.Forms; 组件的命名空间名称 { 内部静态类程序 { /// ///应用程序的主入口点。修改为检查同一计算机上另一个正在运行的实例,并捕获和报告未明确检查的任何错误。 /// [状态线程] 私有静态void M

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


使用系统;
使用系统诊断;
使用系统线程;
使用System.Windows.Forms;
组件的命名空间名称
{
内部静态类程序
{
/// 
///应用程序的主入口点。修改为检查同一计算机上另一个正在运行的实例,并捕获和报告未明确检查的任何错误。
/// 
[状态线程]
私有静态void Main()
{
//用于升级和安装新版本
string[]arguments=Environment.GetCommandLineArgs();
if(arguments.GetUpperBound(0)>0)
{
foreach(参数中的字符串参数)
{
如果(参数.Split('=')[0].ToLower().Equals(“/u”))
{
字符串guid=argument.Split('=')[1];
字符串路径=Environment.GetFolderPath(Environment.SpecialFolder.System);
var si=new ProcessStartInfo(路径+“\\msiexec.exe”、“/x”+guid);
过程启动(si);
Application.Exit();
}
}
//升级结束
}
其他的
{
bool onlyInstance=false;
var mutex=新的互斥(true,Application.ProductName,out-onlyInstance);
如果(!onlyInstance)
{
MessageBox.Show(“此运行的另一个副本”);
返回;
}
AppDomain.CurrentDomain.UnhandledException+=CurrentDomain\u UnhandledException;
Application.ThreadException+=ApplicationThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form1());
}
}
私有静态void CurrentDomain_UnhandledException(对象发送方,UnhandledExceptionEventArgs e)
{
尝试
{
var ex=(Exception)e.ExceptionObject;
MessageBox.Show(“哎哟!请用以下信息联系开发人员”
+“信息:\n\n”+ex.Message+ex.StackTrace,
“致命错误”,MessageBoxButtons.OK,MessageBoxIcon.Stop);
}
捕获(例外)
{
//什么也不做-另一个例外!哇,这不是一件好事。
}
最后
{
Application.Exit();
}
}
公共静态无效应用程序ReadException(对象发送方,ThreadExceptionEventArgs e)
{
尝试
{
MessageBox.Show(“哎哟!请用以下信息联系开发人员”
+“信息:\n\n”+e.Exception.Message+e.Exception.StackTrace,
“错误”,MessageBoxButtons.OK,MessageBoxIcon.Stop);
}
捕获(例外)
{
//什么也不做-另一个例外!哇,这不是一件好事。
}
}
}
}


我觉得这些例行公事很有帮助。在Program.cs中,您发现了哪些有用的方法

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

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

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();
}

我通常有一个非常小的主函数来调用另一个函数(例如Start)——这样,如果某个程序集丢失并且Start无法JITted,我可以捕获TypeLoadException并显示一条可读的错误消息。

对于参数解析,该类是我见过的最好的(通过)。我还为交互式控制台应用程序提供了支持,这些应用程序不只是运行和退出

下面是选项类的一个示例:

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);
}

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


但是,大多数功能都是由main仅实例化和调用的其他对象处理的。

我确定但进入每个程序的唯一代码是我的异常处理程序:

一开始:

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

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


鲍比

我觉得你只是把任何额外的例外情况放在地板上是非常糟糕的。我不认为他会把额外的例外情况放在地板上。他忽略的唯一例外是,当他实际向用户显示错误消息时,即调用MessageBox.Show()时所引起的例外。
#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