C#正确格式化(缩进,对齐)C#

我们有一个代码生成器,它可以管理给定数据库的模式,以自动化我们的内部n层体系结构。 输出是各种C#部分类,每个文件一个。

在使用munge所有字符串的代码中,我们尝试尽可能地保持缩进和格式化,但是当你在Visual Studio中打开文件时格式化是错误的。 一个快速的ctrl-k,ctrl-d修复它,但显然这个重新格式化在下次生成类时会丢失。

我想知道的是,我是否有办法以某种方式自动格式化文本文件的内容,就像Visual Studio一样?

伪代码

Create "code" object, passing text file to constructor Invoke "format" method Re-save text file 

任何帮助非常感谢。

编辑:我应该澄清 – 我希望能够从我的C#代码调用格式,创建包含我生成的C#的文本文件。 代码的格式可以标准化(不必是每个开发人员),我不想安装任何第三方应用程序。

我似乎记得有一个命名空间,其中包含用于在C#中创建C#的大量类: http : //msdn.microsoft.com/en-us/library/system.codedom(VS.80).aspx ,但我不确定如果它包含任何可以帮助的类。

进一步编辑:我的代码生成器是一个通过点击一次安装部署的winforms应用程序。 许多开发人员都在内部使用它。 我需要一个不需要每个开发人员在他们的机器上安装工具的解决方案。

展开谢丽安的回答:

NArrange将允许您进行大量的代码格式化。 它是开源的,源代码可以在他们的网站上找到,因此您可以使用您的工具集成并重新分配它。

您应该只需要dll,然后查看如何调用格式的exe。 它还将创建正在格式化的代码的备份。 如果它符合您的需求,它真的是一个很好的工具。

看看Narrange。你可能需要自动化这些东西作为构建的一部分。
不确定它是否符合您的所有要求。
报价:

NArrange是一个.NET代码美化器,可以自动组织.NET类中的代码成员和元素。

要以编程方式正确缩进代码,您需要Microsoft.CodeAnalysis.CSharp nuget包和.NET framework 4.6+。 示例代码:

 public string ArrangeUsingRoslyn(string csCode) { var tree = CSharpSyntaxTree.ParseText(csCode); var root = tree.GetRoot().NormalizeWhitespace(); var ret = root.ToFullString(); return ret; } 

一内胆:

 csCode = CSharpSyntaxTree.ParseText(csCode).GetRoot().NormalizeWhitespace().ToFullString(); 

您也可以使用NArrange对cs文件中的方法进行排序,组织使用,创建区域等。请注意,NArrange不会缩进任何内容。

您可以使用CodeDOM和CSharpCodeProvider。 它位于名称空间Microsoft.CSharp和System.CodeDom中。

她是一个财产的例子:

 StringWriter writer = new StringWriter(); CSharpCodeProvider provider = new CSharpCodeProvider(); CodeMemberProperty property = new CodeMemberProperty(); property.Type = new CodeTypeReference(typeof(int)); property.Name = "MeaningOfLifeUniverseAndEverything"; property.GetStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(42))); provider.GenerateCodeFromMember(property, writer, null); Console.WriteLine(writer.GetStringBuilder().ToString()); 

此代码将生成:

 private int MeaningOfLifeUniverseAndEverything { get { return 42; } } 

CodeDOM是生成代码的一种非常繁琐的方式。 好的是你可以生成多种语言。 也许你可以找到一个Erlang.NET CodeProvider?

您可以使用CodeSnippetExpression执行一些快捷方式。

只有当您将代码生成器作为VS附加组件运行时 – 每个开发人员才会有不同的设置。

以下是如何从宏或加载项的上下文中执行此操作:

 var dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.8.0"); dte.ExecuteCommand("File.OpenFile", filename); dte.ExecuteCommand("Edit.FormatDocument", filename); dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes); 

警告:正如@Greg Hurlman所说,输出将根据用户的当前选项而有所不同。

编辑:

不幸的是,你的方法要求我在我的winforms应用程序旁边运行VS的实例。 你能想到一种从我的app中创建VS实例的方法(如果可能的话)?

我认为可以从你的Win.Form应用程序中做到。 但是,您必须在运行代码的计算机上安装Visual Studio。

试试这个:

 var dte = (EnvDTE80.DTE2)Microsoft.VisualBasic.Interaction.CreateObject("VisualStudio.DTE.8.0", ""); dte.ExecuteCommand("File.OpenFile", filename); dte.ExecuteCommand("Edit.FormatDocument", filename); dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes); 

请记住,您需要引用EnvDTE80.dll程序集。