2

我有一个奇怪的要求,我被要求在 VBScript 中编写某个验证脚本,因为它是纯文本的。但我在 c# 中更舒服。那么无论如何在Task Scheduler中安排它,以便编译器编译程序(.cs文件中的源代码)并即时运行它。

4

4 回答 4

6

作为一个单独的自编译 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,它是文本。作为改进,您可能希望将/out目标更改为 %TEMP% 中的某个位置。

[更新]更简单的 Hello World 示例。

于 2012-11-21T02:13:13.417 回答
4

您正在寻找的是CSharpCodeProvider

这允许您从源代码编译或评估 C# 代码并运行它。它可以在运行中和从另一个进程中完成。

于 2012-11-21T01:30:34.250 回答
1

假设您希望在命令行中的行为类似于 VBScript/JavaScript,它们的行为类似于普通的 EXE 文件。要查看 JS/VBS 是如何执行的,请检查assoc .jsftype JSType命令的输出。

基本上,您想创建 CMD/BAT 文件,该文件将启动 CSC 以编译您的 .cs 文件,然后使用 CMD 文件的所有原始参数运行可执行文件。然后将此新 CMD 文件与 .CS 文件类型相关联。配置关联检查ftype /?提供了大量信息。

请注意,使用自定义扩展名而不是默认的 .cs(即 .cssript)可能是个好主意,以避免与常规 .cs 文件混淆。

于 2012-11-21T01:40:35.473 回答
1

这里有一个很好的例子, 提供了源代码。本质上,您创建了一个运行器,它是一个执行您的 cs 文件的 exe。

runner 是一个控制台应用程序。您只需将您的 CS 文件作为参数传入。一个警告是你必须将你的类命名为“CSScript”。但它看起来像下面的课程。该链接使用CSharpCodeProvider类即时编译您的源代码。

using System;
using System.Windows.Forms;

class CScript {
    public void Main() {
        // your dynamic code here
    }
}

该示例通过动态编译传入的cs文件来执行源代码,然后使用反射调用Main Method。

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
于 2012-11-21T01:47:38.153 回答