2

マネージャーから、プロジェクトの各 .cs ファイル内で使用できる関数のリストを取得するように依頼されました。

しかし、.cs ファイルの数は膨大です。

手動で見るのは大変です。

スクリプトまたはコードを記述して .cs ファイル内の関数名を見つける方法はありますか?

4

7 に答える 7

5

反射を使用します。すべてのファイルがプロジェクトにある場合は、次を使用できます。

Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type toCheck in toProcess)
{
    MemberInfo[] memberInfos = toCheck.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | OtherBindingFlagsYouMayNeed);
    //Loop over the membersInfos and do what you need to such as retrieving their names
    // and adding them to a file
}

プロジェクトがdllにコンパイルされている場合は、次を使用できます。

Assembly assembly = Assembly.LoadFrom(filePath); //filePath is for the dll
Type[] toProcess = assembly.GetTypes();
//rest of the code is same as above

編集:@BAFが言及しているように、物理ファイルごとの関数を見つけたい場合は、アセンブリのベースディレクトリを取得し(.CodeBaseを介して)、ディレクトリツリーウォークを実行してすべての.csファイルを探し、実装します各ファイル内のメソッド宣言を区別できるパーサー(それを支援するためにレクサーも必要になる場合があります)。どちらについてもひどく難しいことは何もありませんが、それらはいくつかの作業を必要とし、ここで答えとして含めるには複雑すぎます。少なくとも、これは、誰かがより簡単な方法を提案できない限り、私が考えることができるすべてのタイプのメソッド宣言をカバーする最も簡単な答えです。

于 2012-08-31T12:40:32.980 に答える
4

Roslynを見たことがありますか?

Doug Finke による Get-RoslynInfo スクリプト コマンドレットを確認してください: http://www.dougfinke.com/blog/index.php/2011/10/30/analyze-your-c-source-files-using-powershell-and-the -get-roslyninfo-コマンドレット/

于 2012-08-31T13:46:09.000 に答える
0

csharp ファイルをアセンブリにコンパイルできない場合は、パーサーを作成する必要があります。メソッド宣言に一致する正規表現を書くのはかなり簡単です (C# 言語仕様を見てください)。ただし、いくつかの誤検出 (ブロック コメントで宣言されたメソッド) が発生し、getter と setter も考慮する必要があります。

1 つ以上のアセンブリがある場合は、非常に簡単です。Powershell: から System.Reflection を使用することもできます[System.Reflection.Assembly]::ReflectionOnlyLoad(..)。または、アセンブリ検査に Mono.Cecil を使用できます。

ただし、アセンブリが既にある場合は、NDependを使用してください。必要以上のコード情報が得られ、無料試用版があります。

于 2012-08-31T13:38:29.090 に答える
0

前述のようにリフレクションを使用します。これにより、作成した関数のみが返されます。

  Assembly a = Assembly.LoadFile("Insert File Path");
  var typesWithMethods = a.GetTypes().Select(x => x.GetMethods(BindingFlags.Public).Where(y => y.ReturnType.Name != "Void" &&
                                                    y.Name != "ToString" &&
                                                    y.Name != "Equals" &&
                                                    y.Name != "GetHashCode" &&
                                                    y.Name != "GetType"));
  foreach (var assemblyType in typesWithMethods)
  {
    foreach (var function in assemblyType)
    {
      //do stuff with method
    }
  }

タイプのリストがあり、各タイプ内に関数のリストがあります。

  public class TestType
  {
    public void Test()
    {

    }
    public string Test2()
    {
      return "";
    }
  }

上記のテスト タイプを使用すると、提供するコードは Test2 を出力します。これは関数であるためです。これがあなたが探していたものであることを願っています。

編集:明らかに、GetMethods() のオーバーロードを使用して、他の投稿で述べたようにバインディング フラグを使用してパブリックにフィルター処理できます。

于 2012-08-31T12:54:45.817 に答える
0

[プロジェクト プロパティ] の [ビルド] セクションで、XML ドキュメント ファイルを有効にします。プロジェクトをビルドします。出力 XML ファイルには、すべてのクラスとそのメソッド、引数の名前/型などのリストが表示されます。

ここに画像の説明を入力

于 2019-07-26T14:57:50.957 に答える
0

私は次のコードで試しました。これを試してください。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace filedetection
{
class Program
{
    static void Main(string[] args)
    {
        string path = @"D:\projects\projectsfortest\BusinessTest";
        DirectoryInfo d = new DirectoryInfo(path);//Assuming Test is your Folder
        FileInfo[] Files = d.GetFiles("*.cs"); //Getting Text files
        string str = "";
        foreach (FileInfo file in Files)
        {                
            Program program = new Program();
            List<string> allmethord = program.GetAllMethodNames(path+"\\"+file.Name);
            foreach (string methord in allmethord)
            {
                Console.WriteLine(methord);
            }
        }

        Console.ReadKey();
    }

    public List<string> GetAllMethodNames(string strFileName)
    {
        List<string> methodNames = new List<string>();
        var strMethodLines = File.ReadAllLines(strFileName)
                                    .Where(a => (a.Contains("protected") ||
                                                a.Contains("private") ||
                                                a.Contains("public")) &&
                                                !a.Contains("_") && !a.Contains("class"));
        foreach (var item in strMethodLines)
        {
            if (item.IndexOf("(") != -1)
            {
                string strTemp = String.Join("", item.Substring(0, item.IndexOf(")")+1).Reverse());
                strTemp = String.Join("", strTemp.Substring(0, strTemp.IndexOf("  ")).Reverse());
                methodNames.Add(strTemp);                    
            }
        }
        return methodNames.Distinct().ToList();
    }
  }
}
于 2018-08-09T15:40:16.980 に答える
0

Do not create something yourself if someone else has already done the hard work.

Since you have the source code, use a tool like Sandcastle which is designed for generating documentation of the source code. You haven't specified what format the output needs to be, so this may or may not be acceptable.

This is something your project/team should be able to do at any time; someone could add a new method or class 5 minutes after you're finished, making your work obsolete.

于 2012-09-02T11:02:16.663 に答える