Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态编译并运行程序_C#_Csc - Fatal编程技术网

C# 动态编译并运行程序

C# 动态编译并运行程序,c#,csc,C#,Csc,我有一个奇怪的要求,我被要求用VBScript编写某个验证脚本,因为它是纯文本的。但我在c#更舒服。因此,无论如何都可以在任务调度器中对其进行调度,以便编译器编译程序(源代码在.cs文件中)并运行它。您要查找的是 using System; using System.Windows.Forms; class CScript { public void Main() { // your dynamic code here } } 这允许您从源代码编译或评估C代码

我有一个奇怪的要求,我被要求用VBScript编写某个验证脚本,因为它是纯文本的。但我在c#更舒服。因此,无论如何都可以在任务调度器中对其进行调度,以便编译器编译程序(源代码在.cs文件中)并运行它。

您要查找的是

using System;
using System.Windows.Forms;

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

这允许您从源代码编译或评估C代码并运行它。它可以在运行中或从另一个进程执行此操作。

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

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

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

提供了一个源代码示例。实际上,您创建了一个运行程序,它是一个执行cs文件的exe

运行程序是一个控制台应用程序。您只需将CS文件作为参数传入即可。需要注意的是,您必须将类命名为“CSScript”。但它看起来像下面的类。该链接使用该类动态编译源代码

using System;
using System.Windows.Forms;

class CScript {
    public void Main() {
        // your dynamic code here
    }
}
该示例通过动态编译传入的cs文件来执行源代码,然后使用反射来调用Main方法

void ExecuteSource(字符串sourceText){ CSharpCodeProvider codeProvider=新的CSharpCodeProvider()

要调用,请按如下方式运行命令

CS-SCript.exe yourcsfile.cs

作为一个单独的自编译CMD批处理文件,这是一个纯文本且可运行的文件(来自我的博客-)

您可以直接以批处理文件的形式调用此文本文件,它将作为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#compiler.batch(CMD)会忽略这些命令文件将跳过一个错误跳转到下一行,因此此文件的运行方式类似于EXE EXPET,即它的文本。作为改进,您可能需要将
/out
目标更改为%TEMP%中的某个位置


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

我不这么认为,我找到了在fly@AkshayJ:创建一个具有编译代码任务的应用程序。要求任务计划程序在需要时运行该应用程序?为什么必须使用csc?CSharpCodeProvider将提供准确的程序集结果。DOWS不会重新启动了解CSharpCodeProvider的意思。我不想使用任何已编译的代码。所有内容都应为纯文本。您的代码需要编译成exe才能编译任何内容。不幸的是,您需要一个可执行文件来运行任何脚本文件。对于PHP,您使用PHP.exe,vbs,您使用CScript.exe(或system32文件夹中的WScript.exe)。windows自动运行vbs文件而无需您引用它们的唯一原因是,这些文件类型与CScript.exe可执行文件关联,并且CScript.exe位于系统路径中。我想我需要一个批处理文件来调用csc.exe,然后调用其输出。是的,您也可以这样做,但如果您可以删除单个exe在此服务器上编译、运行并为您进行清理。基本上是批处理文件需要执行的操作。%FrameworkIR%和%FrameworkVersion%来自何处?您可以硬编码它们或将它们放入计算机配置中,但您可以在这样的会话中设置它们;%ProgramFiles%\Microsoft SDK\Azure\.NET SDK\v2.5\bin\setenv.cmd