VS2005 Addin续--编写C#代码统计插件

最近公司做软件申报需要统计项目的代码总行数,于是便以此为参考做了个Addin来满足此类需求。在统计时,由于项目中可能排除了一些cs文件,或者一些系统默认生成的文件像AssemblyInfo.cs之类的,其实都不应该在统计范围之内,再深一点,cs文件中的注释,#region,空行等也都不应该被统计在内。一些代码统计软件只能统计某个目录下所有的cs文件,而要达到刚才所描述的功能,有点望尘莫及。如果用VS的外接程序来做,就方便多了。我们可以通过其内置的对象来访问当前IDE打开的解决方案及其下所有包含的项目,代码文件等。

关于如何创建Addin工程,请参考我的另外一篇文章:我编写第一个VS2005的Addin--Getter/Setter

下面对访问相应的内置对象做个简要说明:

        private bool IsValidSolution()

        {

            Solution solution = _applicationObject.Solution;//访问当前的解决方案

            return (solution != null && solution.IsOpen && solution.Projects.Count > 0);//判断当前解决方案是否打开且包含项目

        }



        //获取解决方案下的所有C#文件

        private void RetrieveCSharpCodeFilesFromSolution()

        {

            Solution solution = applicationObject.Solution;

            //solution.FullName用来获取解决方案的完整文件名;

            foreach (Project project in solution.Projects)

            {

                if (string.IsNullOrEmpty(project.FileName)) continue;//如果项目文件名为空则不是真实的项目

                RetrieveCSharpCodeFilesFromProject(project.ProjectItems);//获取项目工程下的所有C#文件

            }

        }



        private void RetrieveCSharpCodeFilesFromProject(ProjectItems projectItems)

        {

            if (projectItems == null) return;

            /*ProjectItem表示当前遍历的项,其可能是目录,也可能是文件

            当是目录时,其get_FileNames返回的是目录路径,如果是文件,则返回文件名(包含完整路径)

            另外,如果当前ProjectItem是aspx之类的文件,那么其FileCount可能是3,也就是包含三个文件,

            这三个文件是xxx.aspx,xxx.aspx.cs,xxx.designer.cs。*/

            foreach (ProjectItem pi in projectItems)

            {

                for (short i = 0; i < pi.FileCount; i++)

                {

                    try

                    {

                        if (IsValidCSharpCodeFile(pi.get_FileNames(i)))

                        {

                            filenames.Add(pi.get_FileNames(i));

                        }

                    }

                    catch

                    {

                    }

                }

                RetrieveCSharpCodeFilesFromProject(pi.ProjectItems);

            }

        }



        private bool IsValidCSharpCodeFile(string filename)

        {

            string fn = System.IO.Path.GetFileName(filename).ToLower();

            if (filename.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString())) return false;//判断是否是目录



            if (fn == "assemblyinfo.cs") return false;//判断当前文件是否是默认生成的AssemblyInfo.cs

            if (fn.EndsWith(".designer.cs")) return false;//判断当前文件是否是designer.cs文件

            if (fn.EndsWith(".cs")) return true;

            return false;

        }
现在,我们得到了解决方案下的所有cs文件,现在就扫描每个cs文件内容,把是注释,空行,#region的行排除掉。通过StreamReader打开cs文件,
调用其ReadLine方法读取每行,然后用正则表达式来判定。如下:
        private static readonly string NULL_LINE_REGEX = @"^/s*___FCKpd___2quot;;

        private static readonly string SINGLELINE_COMMENT_REGEX = @"^/s*(//|///|//*.*/*//s*$)";

        private static readonly string BLOCK_START_COMMENT_REGEX = @".*//*";

        private static readonly string BLOCK_END_COMMENT_REGEX = @"/*/.*";

        private static readonly string REGION_REGEX = @"^/s*(#region/s+|#endregion(/s+|$))";
如果是则不算到代码行数中。在扫描注释块(/*...*/)的过程有点复杂,用stack来处理这个问题。首先我们判断是否是注释块的开始(/*),如果是
并且stack为空或者且从stack中peek的实例是结束标志,则将相关信息(开始行号)及开始标志位的信息作为一个新的对象实例放入到stack中,如
果标志位相同则不做任何事。扫描注释块结束(*/)行时的处理方式类似,只是扫描到对应的注释块开始时,则修改从stack中peek的实例的标志位和
结束行号属性。代码片断:
            Match match = Regex.Match(content, BLOCK_START_COMMENT_REGEX, RegexOptions.Compiled | RegexOptions.Singleline);

            if (match.Success && (stack.Count == 0 || (stack.Peek() as BlockCommentModel).BlockCommentExpressionMode == BlockCommentExpressionMode.End))

            {

                BlockCommentModel bcm = new BlockCommentModel();

                bcm.BlockCommentExpressionMode = BlockCommentExpressionMode.Start;

                bcm.StartLineNo = lineNo;

                stack.Push(bcm);

            }



            match = Regex.Match(content, BLOCK_END_COMMENT_REGEX, RegexOptions.Compiled | RegexOptions.Singleline);

            if (match.Success && stack.Count > 0)

            {

                BlockCommentModel bcm = stack.Peek() as BlockCommentModel;

                if (bcm.BlockCommentExpressionMode == BlockCommentExpressionMode.Start)

                {

                    bcm.BlockCommentExpressionMode = BlockCommentExpressionMode.End;

                    bcm.EndLineNo = lineNo;

                }

            }
OK,原理大致就是这些。此插件已上传到我的资源中。有兴趣的朋友可以使用哈!如何配置使用Addin,参考http://www.cnblogs.com/winkingzhang/archive/2008/01/23/1050444.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
qt-vs-addin-1.2.4-opensource是一个开源的Qt集成开发环境插件。Qt是一种跨平台的应用程序开发框架,它允许开发者使用统一的代码编写跨平台的应用程序。Qt提供了丰富的库和工具,使得开发者可以更方便地创建GUI应用程序、网络应用程序、嵌入式应用程序等。 而qt-vs-addin-1.2.4-opensource则是为了方便使用Visual Studio开发Qt应用程序而开发的插件。Visual Studio是一种常用的集成开发环境,它提供了强大的编辑器、调试器和其他开发工具。而通过qt-vs-addin-1.2.4-opensource插件,开发者可以在Visual Studio中直接使用Qt的功能,如自动生成Qt项目、添加Qt类、设计器支持等。 qt-vs-addin-1.2.4-opensource主要的特点包括: 1. 支持多个Visual Studio版本:这个插件可以与不同版本的Visual Studio(如2010、2012、2013等)兼容,方便开发者选择自己喜欢的开发环境。 2. 丰富的项目模板:插件提供了多种项目模板,包括Qt Widgets应用程序、Qt Quick应用程序等,可以帮助开发者快速创建项目并开始开发。 3. 代码自动补全:插件可以提供Qt类的代码自动补全功能,方便编写代码并减少出错。 4. 可视化设计器:插件还提供了可视化设计器,开发者可以通过拖放控件来快速设计界面。 5. 调试支持:插件可以与Visual Studio的调试器集成,方便开发者进行调试。 总体而言,qt-vs-addin-1.2.4-opensource是一个强大且易于使用的插件,它为开发者提供了更好的开发体验和效率,使得使用Qt开发跨平台应用程序更加便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值