构建带参数的控制台应用程序时,可以使用传递给的参数Main(string[] args).
在过去,我只是索引/循环该数组并完成一些正则表达式来提取值.但是,当命令变得更复杂时,解析会非常难看.
所以我对以下内容感兴趣:
假设命令始终遵循通用标准,例如此处的答案.
我想了解人们如何处理跟踪和登录实际应用程序的故事.以下是一些可能有助于解释您的答案的问题.
构架
你使用什么框架?
如果使用跟踪,是否使用Trace.Correlation.StartLogicalOperation?
您是手动编写此代码,还是使用某种形式的面向方面编程来执行此操作?小心共享代码片段?
您是否在跟踪源上提供任何形式的粒度?例如,WPF TraceSources允许您在不同级别配置它们:
听众
你使用什么日志输出?
如果使用文件,您使用滚动日志还是仅使用单个文件?如何使日志可供人们使用?
查看
您可以使用哪些工具查看日志?
如果要构建ASP.NET解决方案,是否还使用ASP.NET运行状况监视?您是否在运行状况监视器事件中包含跟踪输出?那么Trace.axd呢?
自定义性能计数器怎么样?
假设我有一个包含3个项目的解决方案:
我使用的一些NuGet包将适用于所有3个项目.有些只适用于UI和测试,有些只适用于测试(如NUnit).
使用NuGet进行设置的正确方法是什么?
在任何一种情况下,我应该有多少个packages.config文件?
我试图在我的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中这么难,或者我做错了什么?
在这个帖子中,很多人都表示他们使用log4net.我是TraceSources的粉丝,想知道为什么使用log4net.
这就是我喜欢跟踪源的原因:
由于.NET框架在内部使用TraceSources,它也为我提供了一种配置跟踪的一致方法 - 使用log4net,我必须配置log4net以及TraceSources.
什么log4net给我TraceSources没有(或通过编写几个自定义TraceListener无法完成)?
我正在尝试使用Process.Start重定向的I/O来调用PowerShell.exe字符串,并以UTF-8的形式返回输出.但我似乎无法做到这一点.
我尝试过的:
-Command参数运行Console.OutputEncoding在这两个我的控制台应用程序,并在PowerShell脚本$OutputEncoding在PowerShell中设置Process.StartInfo.StandardOutputEncodingEncoding.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) 鉴于此测试夹具:
[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使用单个线程运行它们?
我有一个使用.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
要从.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更安全吗?
当使用HTTP的WCF绑定,我需要授予自己特殊的权限,以便能够绑定到该端口/路径.我理解这是因为WCF通过http.sys驱动程序接受HTTP流量.
在古时,我们可以新的插座,并绑定到任何老港,这是不使用的,没有被管理员.NetTcpBinding仍然能够做到这一点.
如果我不关心http.sys,有没有办法告诉WCF不要使用它,而只是在仍然使用HTTP绑定时打开一个普通的旧套接字?
.net ×5
c# ×2
logging ×2
trace ×2
asp.net ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
diagnostics ×1
encoding ×1
http ×1
http.sys ×1
log4net ×1
mstest ×1
nuget ×1
powershell ×1
process ×1
razor ×1
unit-testing ×1
utf-8 ×1
wcf ×1
windows ×1
windows-8 ×1