首页 > 解决方案 > 读取 txt 文件并在类中导入为 ac# 代码

问题描述

我想知道这是否可能。例如,bootstrap 有新版本,我需要更改 cdn url 并在 asp.net Web 表单中为RegisterBundles重新构建项目。这是一个简单的 url,我们不需要为该问题重新构建项目。

是否有可能读取 *.txt 文件并在类中用作 c# 代码。上课会和以前一样,我们会活下来。

示例RegisterBundles代码:

public class stylescriptbundle
{
   public void RegisterBundles(BundleCollection bundles)
   {
      BundleTable.Bundles.Add(new ScriptBundle("/mybundle").Include(
         "https://code.jquery.com/jquery-3.4.1.slim.min.js",
         "https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js",
        "https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" 
      );
      BundleTable.Bundles.UseCdn = true;
   }
}

标签: c#asp.netwebformsbundleglobal-asax

解决方案


首先,类似于 robbpriestley 所说的,您应该做的是从文件中读取字符串,以便将它们包含在包中。配置文件是最好的,但如果您对 .txt 非常感兴趣,请尝试以下操作:

var scripts = File.ReadAllLines("someConfigurationFile.txt");
var bundle = new ScriptBundle("/myBundle");
foreach(var script in scripts)
{
    bundle.Include(script);
}
BundleTable.Bundles.UseCdn = true;
BundleTable.Bundles.Add(bundle);

(以上只是我的想法,您可能需要对其进行调整才能使其正常工作。)

也就是说,如果您仍想在运行时编译代码,您可以使用Microsoft.CSharpMicrosoft.CodeDom.Compiler命名空间,根据本教程。出于存档原因,我将在此处尝试对其进行总结。

  1. 将您的代码转换为字符串:var codeStr = File.ReadAllText("runtime compiled.cs");
  2. 创建提供者和编译器:var provider = new CSharpCodeProvider(); var parameters = new CodeParameters();
  3. 定义编译器的参数。听起来您肯定想将其编译到内存中,并且您需要引用您在该代码中使用的任何程序集:parameters.GenerateInMemory = true; parameters.ReferencedAssemblies.Add("necessaryAssembly.dll");
  4. 编译:var results = provider.CompileAssemblyFromSource(parameters, code);
  5. 检查错误
  6. 获取你的程序集:var assembly = results.CompiledAssembly;这样你就可以得到你的类型:var program = assembly.GetType("first.program");这样你就可以得到你的方法:var main = program.GetMethod("Main");
  7. 然后您可以使用 Invoke 调用您的方法:(main.Invoke(null, null);查看MethodInfo上的参考。)

推荐阅读