小编Pau*_*ell的帖子

在C#中解析命令行参数的最佳方法?

构建带参数的控制台应用程序时,可以使用传递给的参数Main(string[] args).

在过去,我只是索引/循环该数组并完成一些正则表达式来提取值.但是,当命令变得更复杂时,解析会非常难看.

所以我对以下内容感兴趣:

  • 您使用的库
  • 您使用的模式

假设命令始终遵循通用标准,例如此处的答案.

.net c# command-line-arguments

733
推荐指数
8
解决办法
49万
查看次数

记录最佳实践

我想了解人们如何处理跟踪和登录实际应用程序的故事.以下是一些可能有助于解释您的答案的问题.

构架

你使用什么框架?

  • log4net的
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • 记录应用程序块
  • 其他?

如果使用跟踪,是否使用Trace.Correlation.StartLogicalOperation?

您是手动编写此代码,还是使用某种形式的面向方面编程来执行此操作?小心共享代码片段?

您是否在跟踪源上提供任何形式的粒度?例如,WPF TraceSources允许您在不同级别配置它们:

  • System.Windows - 所有WPF的设置
  • System.Windows.Animation - 专门为动画覆盖.

听众

你使用什么日志输出?

  • 文本文件
  • XML文件
  • 事件簿
  • 其他?

如果使用文件,您使用滚动日志还是仅使用单个文件?如何使日志可供人们使用?

查看

您可以使用哪些工具查看日志?

  • 记事本
  • 尾巴
  • 事件查看器
  • Systems Center Operations Manager/Microsoft Operations Manger
  • WCF服务跟踪查看器
  • 其他?

如果要构建ASP.NET解决方案,是否还使用ASP.NET运行状况监视?您是否在运行状况监视器事件中包含跟踪输出?那么Trace.axd呢?

自定义性能计数器怎么样?

.net asp.net logging trace

323
推荐指数
8
解决办法
16万
查看次数

NuGet适用于多个项目的解决方案

假设我有一个包含3个项目的解决方案:

  • 核心
  • UI
  • 测试

我使用的一些NuGet包将适用于所有3个项目.有些只适用于UI和测试,有些只适用于测试(如NUnit).

使用NuGet进行设置的正确方法是什么?

  1. 我是否需要在所有三个项目中使用"添加库包参考"?
  2. 我是否应该在第一次需要包时使用"添加库包参考",然后使用添加参考 - >浏览进行后续使用?

在任何一种情况下,我应该有多少个packages.config文件?

.net nuget

149
推荐指数
5
解决办法
5万
查看次数

使用Razor声明性视图中的MVC HtmlHelper扩展

我试图在我的App_Code文件夹中为MVC 3 RTM项目创建一个Razor声明性帮助器.

我遇到的问题是MVC HtmlHelper扩展(如ActionLink)不可用.这是因为编译的帮助程序派生自System.Web.WebPages.HelperPage,虽然它公开了一个Html属性,但它的类型System.Web.WebPages.HtmlHelper而不是System.Web.Mvc.HtmlHelper.

我得到的一种错误的例子是:

'System.Web.Mvc.HtmlHelper'不包含'ActionLink'的定义,也没有扩展方法'ActionLink'接受类型为'System.Web.Mvc.HtmlHelper'的第一个参数'(你是否缺少using指令)或汇编参考?)

我唯一的解决方案是创建自己的HelperPage并覆盖Html属性:

using System.Web.WebPages;

public class HelperPage : System.Web.WebPages.HelperPage 
{
    // Workaround - exposes the MVC HtmlHelper instead of the normal helper
    public static new HtmlHelper Html
    {
        get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我必须在每个助手的顶部写下面的内容:

@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html

@helper DoSomething()
{
    @Html.ActionLink("Index", "Home")
}
Run Code Online (Sandbox Code Playgroud)

它是否意味着在MVC 3中这么难,或者我做错了什么?

asp.net-mvc razor asp.net-mvc-3

121
推荐指数
5
解决办法
7万
查看次数

log4net与TraceSource

这个帖子中,很多人都表示他们使用log4net.我是TraceSources的粉丝,想知道为什么使用log4net.

这就是我喜欢跟踪源的原因:

  • 可插入的侦听器 - XML,TextFile,Console,EventLog,自己动手
  • 可定制的跟踪开关(错误,警告,信息,详细,开始,结束,自定义)
  • 可定制的配置
  • Logging Application Block只是一大组TraceListeners
  • 活动/范围的关联(例如,将ASP.NET请求中的所有日志与给定客户相关联
  • 服务跟踪查看器允许您单独显示针对这些活动的事件
  • 所有这些都可以在app.config/web.config中配置.

由于.NET框架在内部使用TraceSources,它也为我提供了一种配置跟踪的一致方法 - 使用log4net,我必须配置log4net以及TraceSources.

什么log4net给我TraceSources没有(或通过编写几个自定义TraceListener无法完成)?

.net logging log4net trace diagnostics

70
推荐指数
2
解决办法
2万
查看次数

PowerShell的UTF-8输出

我正在尝试使用Process.Start重定向的I/O来调用PowerShell.exe字符串,并以UTF-8的形式返回输出.但我似乎无法做到这一点.

我尝试过的:

  • 传递命令以通过-Command参数运行
  • 使用UTF-8编码将PowerShell脚本作为文件写入磁盘
  • 使用具有BOM编码的UTF-8将PowerShell脚本作为文件写入磁盘
  • 使用UTF-16将PowerShell脚本作为文件写入磁盘
  • 设置Console.OutputEncoding在这两个我的控制台应用程序,并在PowerShell脚本
  • $OutputEncoding在PowerShell中设置
  • 设置 Process.StartInfo.StandardOutputEncoding
  • Encoding.Unicode而不是做到这一切Encoding.UTF8

在每种情况下,当我检查我给出的字节时,我会得到与原始字符串不同的值.我真的很想解释为什么这不起作用.

这是我的代码:

static void Main(string[] args)
{
    DumpBytes("Héllo");

    ExecuteCommand("PowerShell.exe", "-Command \"$OutputEncoding = [System.Text.Encoding]::UTF8 ; Write-Output 'Héllo';\"",
        Environment.CurrentDirectory, DumpBytes, DumpBytes);

    Console.ReadLine();
}

static void DumpBytes(string text)
{
    Console.Write(text + " " + string.Join(",", Encoding.UTF8.GetBytes(text).Select(b => b.ToString("X"))));
    Console.WriteLine();
}

static int ExecuteCommand(string executable, string arguments, string workingDirectory, Action<string> output, Action<string> error)
{
    try
    {
        using …
Run Code Online (Sandbox Code Playgroud)

powershell encoding utf-8 character-encoding io-redirection

44
推荐指数
2
解决办法
10万
查看次数

强制MSTest使用单个线程

鉴于此测试夹具:

[TestClass]
public class MSTestThreads
{
    [TestMethod]
    public void Test1()
    {
        Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }

    [TestMethod]
    public void Test2()
    {
        Trace.WriteLine(Thread.CurrentThread.ManagedThreadId);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用MSTest通过Visual Studio或命令行运行测试会打印两个不同的线程号(但它们仍然按顺序运行).

有没有办法强制MSTest使用单个线程运行它们?

unit-testing mstest visual-studio

34
推荐指数
2
解决办法
2万
查看次数

等待.NET 4.0:有意义的堆栈跟踪

我有一个使用.NET 4.0的C#控制台应用程序项目,安装了Microsoft.Bcl.Async软件包.我用这个代码:

internal class Program
{
    private static void Main(string[] args)
    {
        Foo().Wait();
    }

    static void Log(Exception ex)
    {

    }

    private static async Task Foo()
    {
        try
        {
            await DoSomething();
        }
        catch (Exception ex)
        {
            Log(ex);
        }
    }

    private static async Task DoSomething()
    {
        throw new DivideByZeroException();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在Log方法中放置一个断点,我得到了DivideByZero异常,但我看到的堆栈跟踪是:

at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.GetResult()
at AsyncStacks.Program.<Foo>d__0.MoveNext() in p:\Sandbox\AsyncStacks\AsyncStacks\Program.cs:line 25
Run Code Online (Sandbox Code Playgroud)

这个堆栈跟踪几乎没用,因为它没有告诉我实际抛出异常的位置.

如果我将项目更改为目标.NET 4.5,我会得到一个更有用的异常:

at AsyncStacks.Program.<DoSomething>d__3.MoveNext() in p:\Sandbox\AsyncStacks\AsyncStacks\Program.cs:line 35
--- End of stack trace from …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous exception-handling task-parallel-library async-await

24
推荐指数
1
解决办法
2707
查看次数

在Windows 8/Chrome上打破了Process.Start(url) - 还有其他选择吗?

要从.NET应用程序打开URL,许多站点(包括StackOverflow)都引用了这个示例:

Process.Start("http://www.google.com/");
Run Code Online (Sandbox Code Playgroud)

在Windows 8上,如果Internet Explorer是默认浏览器,则此方法有效.但是,如果Google Chrome是默认设置,则会失败并显示:

Unhandled Exception: System.ComponentModel.Win32Exception: Class not registered
Run Code Online (Sandbox Code Playgroud)

这是否表明此方法不再是在Windows上打开URL的正确方法?有哪些替代品?直接启动Internet Explorer更安全吗?

.net google-chrome process process.start windows-8

23
推荐指数
2
解决办法
9110
查看次数

没有HTTP.SYS的WCF

当使用HTTP的WCF绑定,我需要授予自己特殊的权限,以便能够绑定到该端口/路径.我理解这是因为WCF通过http.sys驱动程序接受HTTP流量.

在古时,我们可以新的插座,并绑定到任何老港,这是不使用的,没有被管理员.NetTcpBinding仍然能够做到这一点.

如果我不关心http.sys,有没有办法告诉WCF不要使用它,而只是在仍然使用HTTP绑定时打开一个普通的旧套接字?

windows wcf http http.sys

20
推荐指数
1
解决办法
2641
查看次数