我有一个奇怪的要求,我被要求在VBScript中编写某个验证脚本,因为它是纯文本。但我对c#感到更舒服。所以无论如何都要在任务调度程序中安排它,以便编译器编译程序(.cs文件中的源代码)并在运行中运行它。
答案 0 :(得分:5)
这很容易作为单个自编译CMD批处理文件。这个是纯文本和可运行的(从我的博客条目 - Dynamically Create an Executable from user-data Text)。
您可以直接将此文本文件作为批处理文件调用,它将作为EXE运行。只需使用.CMD扩展名(包括所有C#代码)保存文件并正常运行。
/* This section is run in batch file mode
%FrameworkDir%%FrameworkVersion%\csc.exe /nologo /out:bootstrap.exe /Reference:%FrameworkDir%%FrameworkVersion%\System.Net.dll "%0"
goto end
*/
using System;
static class Program
{
static void Main(string[] argv)
{
if (argv.Length > 0)
Console.Write(argv[0]);
Console.WriteLine();
}
}
/*
:end
REM ** Run the program
BootStrap.exe "Hello world!"
REM */
/* */
注释允许您将批处理文件命令编译为自身,当然它们被C#编译器忽略。批处理(CMD)文件将跳过错误到下一行,因此该文件像EXE exept一样运行它的文本。作为一项改进,您可能希望将/out
目标更改为%TEMP%中的某个位置。
[更新] 更简单的Hello World示例。
答案 1 :(得分:4)
您要找的是CSharpCodeProvider。
这允许您从源代码编译或评估C#代码并运行它。它可以在飞行中和其他过程中完成。
答案 2 :(得分:1)
假设您希望在命令行中使用与VBScript / JavaScript类似的行为,其行为与普通EXE文件类似。要了解如何执行JS / VBS,请检查assoc .js
和ftype JSType
命令的输出。
基本上你想要创建CMD / BAT文件,它将启动CSC来编译.cs文件,而不是运行可执行文件和CMD文件的所有原始参数。将此新CMD文件与.CS文件类型相关联。要配置关联,请ftype /?
提供大量信息。
请注意,最好使用自定义扩展名而不是默认.cs(即.cssript),以避免与常规.cs文件混淆。
答案 3 :(得分:1)
有一个很好的例子here,提供了源代码。基本上你创建了一个运行你的cs文件的运行器。
跑步者是一个控制台应用程序。您只需将您的CS文件作为参数传递。需要注意的是,您必须将您的类命名为“CSScript”。但它看起来像下面的课程。该链接使用CSharpCodeProvider类来动态编译源代码。
using System;
using System.Windows.Forms;
class CScript {
public void Main() {
// your dynamic code here
}
}
该示例通过动态编译传入的cs文件来执行源,然后使用反射来调用Main方法。
void ExecuteSource(String sourceText){ CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler compiler = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.OutputAssembly = "CS-Script-Tmp-Junk";
parameters.MainClass = "CScript.Main";
parameters.IncludeDebugInformation = false;
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
parameters.ReferencedAssemblies.Add(asm.Location);
}
CompilerResults results = compiler.CompileAssemblyFromSource(parameters, sourceText);
if (results.Errors.Count > 0) {
string errors = "Compilation failed:\n";
foreach (CompilerError err in results.Errors) {
errors += err.ToString() + "\n";
}
MessageBox.Show(errors, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} else {
object o = results.CompiledAssembly.CreateInstance("CScript");
Type type = o.GetType();
MethodInfo m = type.GetMethod("Main");
m.Invoke(o, null);
if (File.Exists("CS-Script-Tmp-Junk")) { File.Delete("CS-Script-Tmp-Junk"); }
}
}
要打电话给你,按照以下方式运行命令
CS-SCript.exe yourcsfile.cs