【问题标题】:How to extract the C# code from the razor files(CsHtml)?如何从剃刀文件(CsHtml)中提取 C# 代码?
【发布时间】:2016-04-20 00:56:06
【问题描述】:

我正在构建一个控制台应用程序,它可以扫描 MVC 应用程序和简单的 asp.Net 类(即 .cs 文件)。 我已将 roslyn 解析器用于简单的 C# 代码,它运行良好:)。 现在我想扫描剃须刀文件,但 roslyn 编译器没有像 C# 那样扫描它。 Leme 给你举个例子..这是我的 Razor 文件..

@using System.Text;
@using Microsoft.ApplicationBlocks.Data;
@using System.Configuration;
@using System.Data;
@using System.Data.SqlClient;
    ViewBag.Title = "throwEx";
}
<h2>throwEx</h2>
<h3>
    @{
        string name = "";
        string country = "";
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;

        List<SqlParameter> parameters = new List<SqlParameter>();
        parameters.Add(new SqlParameter("@Name", name));
        parameters.Add(new SqlParameter("@Country", country));
        int customerId = Convert.ToInt32(SqlHelper.ExecuteScalar(constr, CommandType.Text, "query", parameters.ToArray()));
    }
</h3>

这里我只想扫描 C# 代码。如何仅提取 @{*this Part only :)}。

【问题讨论】:

  • 您遇到了什么错误?您尝试过什么代码进行“扫描”?您是否希望代码通过目录和文件类型匹配,使用视图作为输入参数......?
  • 不,我没有收到任何特定错误,问题是我的应用程序将扫描 Web 应用程序并检测任何违规行为,例如我希望开发人员不要使用内联查询,而是应该使用存储过程。所以在在这种情况下,如果他们编写了此代码,则应该创建一个 volation :)。它在正常的 .cs 页面中运行良好,但在这里它没有将 sn-p 的这一部分检测为 c#,而是将其作为简单的文本文档:(....我只想提取这个 C# 代码并传递它作为解析器的 Cs Doc :) 但是如何? :(
  • 感谢您的快速回复:)
  • 您不应该在 cshtml 文件中包含任何类型的 SQL 查询。那些属于控制器。
  • 好吧,对于一般情况,您需要一个 Razor 解析器。据我所知,Roslyn 不支持 Razor,因此您需要通过 Razor 解析器运行代码,然后提取所有 C# 代码,最后以有意义的方式在 Roslyn 中使用该 C# 代码:)

标签: c# razor roslyn


【解决方案1】:

您可能想要编写一个可以接受参数(文件名/其他)并使用流读取器的控制台应用程序。 https://msdn.microsoft.com/en-us/library/db5x7c0d(v=vs.110).aspx

    using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 0)
            {
                string line = null;
                string targetStart = "@{";
                string targetEnd = "}";
                string fileName = args[0];

                using (var reader = new StreamReader(fileName))
                {
                    line = reader.ReadLine();
                    if (line.Contains(targetStart))
                    {
                        while (reader.ReadLine() != targetEnd)
                        {
                            var readLine = reader.ReadLine();
                            if (readLine != null) Console.WriteLine(readLine.ToString());
                        }
                    }
                    Console.Read();
                }
            }

        }
    }
}

** 我在 .cshtml 上对此进行了测试,它确实有效

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2022-01-28
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多