【问题标题】:How can i get lines of code / fetch declaration in c#? [closed]如何在 c# 中获取代码行/获取声明? [关闭]
【发布时间】:2016-03-09 18:19:00
【问题描述】:

您好,谁能告诉我如何从 C# 代码中获取代码行。 例如,我在 c# 中有以下代码

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

namespace MyCodeHelp
{
    class MultiplicationProgram
    {
        public int Multiplication(int Firstnumber, int SecondNumber)
        {
            int Result = (Firstnumber * SecondNumber);
            return Result;
        }
    }
} 

那么请告诉我如何从上面的代码中获取以下代码并将其显示在标签或面板中?

public int Multiplication(int Firstnumber, int SecondNumber)
{
    int Result = (Firstnumber * SecondNumber);
    return Result;
}

【问题讨论】:

  • 将代码放入文本文件并读取文本文件,然后将文本写入您的控件。
  • 不清楚你在问什么。 “获取代码行”是什么意思?您只是想阅读.cs 文件吗?
  • 这确实不能可靠地完成,因为在执行应用程序时源代码可能不再可用。我认为您最大的希望可能是将源代码作为资源包含在您编译的程序集中。
  • @recursive,MsBuild 让这一切变得简单:<Target Name="CodeAsResource" BeforeTargets="BeforeBuild"><ItemGroup><EmbeddedResource Include="@(Compile)" /></ItemGroup></Target>
  • @Seano666 - 为什么还要这样做? cs 文件已经是文本文件了

标签: c# asp.net metaprogramming


【解决方案1】:

获取您的面板/标签名称,然后执行以下操作:

labelName.Text = Result.ToString();

【讨论】:

  • 我不太确定您要的是什么,但我认为您要的是这样......
【解决方案2】:

您无法从编译后的 dll 中获取代码,您必须将代码作为资源或松散文件包含在内。一种方法是添加一个 MSBuild 步骤,将所有 Compile 项嵌入为 EmbeddedResources。

在您的.csproj 文件中,将以下内容添加到末尾:

之前:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- ... -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

之后:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- ... -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="CodeAsResource" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <EmbeddedResource Include="@(Compile)" />
    </ItemGroup>
  </Target>
</Project>

那么你就可以把它当作资源来访问了:

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

namespace Codeception
{
    class Program
    {
        static void Main(string[] args)
        {
            var code = getcode("Program.cs");

            Console.WriteLine(code);
        }

        private static string getcode(string filename)
        {
            using (var sr = new StreamReader(typeof(Program).Assembly.GetManifestResourceStream("Codeception." + filename)))
            {
                return sr.ReadToEnd();
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    这是一个例子:

            private void Form1_Load(object sender, EventArgs e)
        {
            string filePath = @"";
    
            using (var sr = new StreamReader(filePath))
            {
                string line;
    
                while ((line = sr.ReadLine()) != null)
                {
                    label1.Text += "\n" + line;
                }
            }
        }
    

    【讨论】:

      【解决方案4】:

      好吧,我想您想从您编写的源代码中获取一些行,对吧?

      首先,您需要将您的代码(或代码的文本副本)与您的二进制文件一起发送,并将其放在已知路径中。

      然后,您可以使用 File.OpenText 方法打开文件(https://msdn.microsoft.com/en-us/library/system.io.file.opentext(v=vs.110).aspx 中的示例)。

      要从文件中获取特定内容(这是您从 OpenText 方法返回的 StreamReader),如果您找到您正在寻找的一段代码。

      如果您想稍后更改代码,我建议您将要共享的代码放在“区域”标签 (https://msdn.microsoft.com/en-us/library/9a1ybwek.aspx) 中。这样您就可以专门查找该区域,而无需担心更改代码。

      希望能帮到你。

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多