读取 txt 文件并在 class 中导入为 c# 代码
Reading txt file and import as a c# code in a class
我想知道这是否可能。例如 bootstrap 有新版本,我需要更改 cdn url 并在 asp.net 网络表单中为 RegisterBundles 重新构建项目。很简单 url 我们不需要为该问题重新构建项目。
是否可以读取 *.txt 文件并在 class 中用作 c# 代码。 Class会和以前一样,我们会活下来。
示例 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;
}
}
不要为此使用 TXT 文件。将字符串作为 settings 放入您的 web.config
,然后使用提供的 ASP.NET ConfigurationManager
来引用它们。
例如,参见:
首先,与 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.CSharp
和 Microsoft.CodeDom.Compiler
命名空间,根据 this tutorial。出于存档原因,我将尝试在此处进行总结。
- 将您的代码转换为字符串:
var codeStr = File.ReadAllText("runtime compiled.cs");
- 创建提供者和编译器:
var provider = new CSharpCodeProvider(); var parameters = new CodeParameters();
- 定义编译器的参数。听起来您肯定想将它编译到内存中,并且您需要引用您在该代码中使用的任何程序集:
parameters.GenerateInMemory = true; parameters.ReferencedAssemblies.Add("necessaryAssembly.dll");
- 编译:
var results = provider.CompileAssemblyFromSource(parameters, code);
- 检查错误
- 获取您的程序集:
var assembly = results.CompiledAssembly;
这样您就可以获得您的类型:var program = assembly.GetType("first.program");
这样您就可以获取您的方法:var main = program.GetMethod("Main");
- 然后您可以使用 Invoke 调用您的方法:
main.Invoke(null, null);
(查看 MethodInfo 上的参考资料。)
我想知道这是否可能。例如 bootstrap 有新版本,我需要更改 cdn url 并在 asp.net 网络表单中为 RegisterBundles 重新构建项目。很简单 url 我们不需要为该问题重新构建项目。
是否可以读取 *.txt 文件并在 class 中用作 c# 代码。 Class会和以前一样,我们会活下来。
示例 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;
}
}
不要为此使用 TXT 文件。将字符串作为 settings 放入您的 web.config
,然后使用提供的 ASP.NET ConfigurationManager
来引用它们。
例如,参见:
首先,与 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.CSharp
和 Microsoft.CodeDom.Compiler
命名空间,根据 this tutorial。出于存档原因,我将尝试在此处进行总结。
- 将您的代码转换为字符串:
var codeStr = File.ReadAllText("runtime compiled.cs");
- 创建提供者和编译器:
var provider = new CSharpCodeProvider(); var parameters = new CodeParameters();
- 定义编译器的参数。听起来您肯定想将它编译到内存中,并且您需要引用您在该代码中使用的任何程序集:
parameters.GenerateInMemory = true; parameters.ReferencedAssemblies.Add("necessaryAssembly.dll");
- 编译:
var results = provider.CompileAssemblyFromSource(parameters, code);
- 检查错误
- 获取您的程序集:
var assembly = results.CompiledAssembly;
这样您就可以获得您的类型:var program = assembly.GetType("first.program");
这样您就可以获取您的方法:var main = program.GetMethod("Main");
- 然后您可以使用 Invoke 调用您的方法:
main.Invoke(null, null);
(查看 MethodInfo 上的参考资料。)