0

私は Visual Studio 2005 C# でアドインを作成して、ソース ファイルとヘッダー ファイル、および同様の命名構造に従うスクリプト ファイルを簡単に切り替えることができるようにしています。ただし、ディレクトリ構造では、すべて同じプロジェクトにあるにもかかわらず、すべてのファイルが異なる場所にあります。

ほとんどすべての部品が揃っていますが、ファイル名だけに基づいてソリューション内のファイルを見つけて開く方法がわかりません。つまり、たとえば c:\code\project\subproject\src\blah.cpp から来ていることはわかっていて、c:\code\project\subproject\inc\blah.h を開きたいのですが、開きません。 blah.h がどこにあるかは必ずしもわかりません。さまざまなディレクトリ パスをハードコードすることはできますが、その場合、ユーティリティは堅牢であるほど汎用的ではありません。

ソリューションには複数のプロジェクトがあり、これも少し面倒なようです。この時点で、すべてのプロジェクトを反復処理し、すべてのプロジェクト アイテムを反復処理して、特定のファイルが存在するかどうかを確認し、適切な参照を取得する必要があると考えています。

しかし、これを行うにはもっと簡単な方法があるに違いないと私には思えます。

4

1 に答える 1

1

任意のユーザーのファイル構造に対して一般的に機能するには、すべてのプロジェクトのすべてのファイルを列挙する必要があります。これで始められるはずです。そして、まあ、ほぼ完成しました:-)

    internal static string GetSourceOrInclude(bool openAndActivate)
    {
        // Look in the project for a file of the same name with the opposing extension
        ProjectItem thisItem = Commands.Application.ActiveDocument.ProjectItem;
        string ext = Path.GetExtension(thisItem.Name);
        string searchExt = string.Empty;
        if (ext == ".cpp" || ext == ".c")
            searchExt = ".h";
        else if (ext == ".h" || ext == ".hpp")
            searchExt = ".cpp";
        else
            return(string.Empty);

        string searchItemName = thisItem.Name;
        searchItemName = Path.ChangeExtension(searchItemName, searchExt);

        Project proj = thisItem.ContainingProject;
        foreach(ProjectItem item in proj.ProjectItems)
        {
            ProjectItem foundItem = FindChildProjectItem(item, searchItemName);
            if (foundItem != null)
            {
                if (openAndActivate)
                {
                    if (!foundItem.get_IsOpen(Constants.vsViewKindCode))
                    {
                        Window w = foundItem.Open(Constants.vsViewKindCode);
                        w.Visible = true;
                        w.Activate();
                    }
                    else
                    {
                        foundItem.Document.Activate();
                    }
                }

                return(foundItem.Document.FullName);
            }

        return(string.Empty);
    }

プロジェクトに追加せずにヘッダーがインクルードパスに含まれる可能性があるため、上記が失敗した場合は、含まれているプロジェクトのインクルードパスも調べることができる可能性があることに注意してください。読者の練習問題として残しておきます。

于 2010-05-07T19:37:33.657 に答える