7

社内のn層アーキテクチャを自動化するために、特定のデータベースのスキーマを変更するコードジェネレーターがあります。出力は、ファイルごとに1つずつ、さまざまなC#部分クラスです。

すべての文字列を変更するコードでは、可能な限りインデントと書式設定を常に把握するようにしていますが、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アプリです。社内の多くの開発者によって使用されています。各開発者が自分のマシンにツールをインストールする必要がないソリューションが必要です。

4

5 に答える 5

6

Narrangeを見てみましょう。ビルドの一部としてこれらを自動化する必要があるでしょう。
ただし、すべての要件を満たしているかどうかはわかりません。
引用するには:

NArrange は、.NET クラス内のコード メンバーと要素を自動的に編成する .NET コード ビューティファイアーです。

于 2009-03-25T13:20:46.237 に答える
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 を使用すると、いくつかのショートカットを実行できる場合があります。

于 2009-03-25T13:41:34.000 に答える
0

コードジェネレーターをVSアドオンとして実行している場合のみ、開発者ごとに異なる設定が行われます。

于 2009-03-25T13:10:58.397 に答える
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 アセンブリへの参照が必要になることに注意してください。

于 2009-03-25T13:37:01.983 に答える