我们有一个代码生成器,munges给定数据库的模式,以自动化我们的内部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应用程序。它在内部被许多开发人员使用。我需要一个不需要每个开发人员在他们的机器上安装工具的解决方案。
答案 0 :(得分:6)
看看Narrange。作为构建的一部分,你可能需要自动化这些东西。
不确定它是否符合您的所有要求
引用:
NArrange是一个.NET代码美化器 自动组织代码 .NET中的成员和元素 类。
答案 1 :(得分:5)
扩展Cherian的回答:
NArrange将允许您执行大量代码格式设置。它是开源的,源代码可以在他们的网站上找到,因此您可以使用您的工具集成并重新分配它。
你应该只需要dll,只需看看如何调用格式的exe。它还将创建正在格式化的代码的备份。如果它符合您的需求,它真的是一个很好的工具。
答案 2 :(得分:4)
要以编程方式正确缩进代码,您需要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不会缩进任何内容。
答案 3 :(得分:1)
您可以使用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执行一些快捷方式。
答案 4 :(得分:0)
只有当您将代码生成器作为VS附加组件运行时 - 每个开发人员才会有不同的设置。
答案 5 :(得分:0)
以下是如何从宏或加载项的上下文中执行此操作:
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的实例。你能想到一种从我的应用程序中创建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程序集。