Pergunta

Temos um gerador de código que munges o esquema de um determinado banco de dados para automatizar nossa arquitetura n-tier inhouse. A saída é várias classes parciais C #, uma por cada ficheiro.

No código para munge todas as cordas, nós tentamos e manter no topo do recuo e formatação, tanto quanto possível, mas, invariavelmente, quando você vem para abrir o arquivo no Visual Studio a formatação é errado. A ctrl-k rápida, correções Ctrl-d-lo, mas obviamente este reformatação é perdida na próxima vez que a classe é gerado.

O que eu gostaria de saber, é se existe uma maneira que eu possa de alguma forma formatar automaticamente o conteúdo do ficheiro de texto da mesma forma Visual Studio faz?

Pseudocódigo

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

Qualquer ajuda muito apreciada.

EDIT: Devo esclarecer - Eu quero ser capaz de invocar a formatação do meu código C # que cria o ficheiro de texto que contém o meu gerada C #. O formato do código pode ser padronizado (não tem que ser por desenvolvedor), e eu não quero ter que instalar qualquer aplicativo 3rd-party.

Eu me lembro que há um namespace contendo cargas de classes para criar C # em C #: http://msdn.microsoft.com/en-us/library/system.codedom (VS.80) .aspx , mas estou não tenho certeza se ele contém qualquer classes que poderia ajudar.

editar mais: Meu gerador de código é um aplicativo winforms implementado através de uma instalação clique com o botão uma vez. Ele é usado por muitos desenvolvedores internos. Eu preciso de uma solução que não requer cada desenvolvedor ter uma ferramenta instalada em sua máquina.

Foi útil?

Solução

Para expandir a resposta de Cherian:

NArrange lhe permitirá fazer um monte de código de formatação. É open source, ea fonte está disponível em seu site, então você poderia integrar e redistbute-lo com sua ferramenta.

Você só deve precisar a dll de e basta olhar para o exe sobre como chamar a formatação. Ele também irá criar um backup do código que está sendo formatado. É realmente uma boa ferramenta se adapta às suas necessidades.

Outras dicas

Dê uma olhada Narrange .You'll provavelmente precisa automatizar essas coisas como parte da compilação.
Não tenho certeza se ele atende todas as suas necessidades embora.
Para citar:

NArrange é um embelezador de código .NET que organiza automaticamente o código membros e elementos dentro .NET classes.

Para código corretamente travessão programaticamente você precisaria pacote NuGet Microsoft.CodeAnalysis.CSharp e .NET framework 4.6 +. código de exemplo:

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

One-liner:

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

Você também pode usar NArrange para classificar métodos em seu arquivo de cs, organizar usings, criar regiões, etc. Note-se que NArrange não faz nada travessão.

Você pode usar CodeDOM eo CSharpCodeProvider. É tudo nos namespaces Microsoft.CSharp e System.CodeDom.

Seu é um exemplo de uma propriedade:

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

Este código irá gerar:

private int MeaningOfLifeUniverseAndEverything {
    get {
        return 42;
    }
}

O CodeDOM é uma maneira muito conversador para gerar o código. A coisa boa é que você pode gerar vários idiomas. Talvez você possa encontrar uma Erlang.NET codeProvider?

Você pode ser capaz de fazer alguns atalhos usando CodeSnippetExpression.

Só se você estiver executando o gerador de código como um VS add-on -. Cada desenvolvedor vai ter configurações diferentes

Aqui está como fazê-lo a partir do contexto de uma macro ou suplemento:

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

Aviso: Como @ Greg Hurlman diz, a saída irá variar dependendo das opções atuais do usuário.

Editar:

, infelizmente, o seu método me obriga a ter uma instância de VS correndo ao lado de minha winforms aplicativo. Você pode pensar em uma maneira de criar uma instância de VS de dentro meu aplicativo (se isso é mesmo possível)?

Eu acho que poderia ser possível fazer a partir do seu aplicativo Win.Form. No entanto, você terá que ter o Visual Studio instalado na máquina que executa o código.

Tente isto:

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

Tenha em mente que você vai precisar de referências ao EnvDTE80.dll montagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top