이상한 요구 사항이 있습니다. VBScript에서 특정 유효성 검사 스크립트를 일반 텍스트로 코딩하도록 요청 받았습니다. 하지만 C#에서 더 편합니다. 어쨌든 작업 스케줄러에서 컴파일러가 프로그램 (.cs 파일의 소스 코드)을 컴파일하고 즉시 실행하도록 예약하는 방법이 있습니다.즉시 컴파일하고 실행하십시오.
답변
정상적인 EXE 파일과 비슷한 동작을하는 명령 줄에서 VBScript/JavaScript와 비슷한 동작을 원한다고 가정합니다. JS/VBS 실행 방법을 보려면 assoc .js
및 ftype JSType
명령의 출력을 확인하십시오.
기본적으로 CSC를 실행하여 .cs 파일을 컴파일하고 CMD 파일의 모든 원래 매개 변수로 실행 파일을 실행하는 CMD/BAT 파일을 만들려고합니다. 이 새로운 CMD 파일을 .CS 파일 유형과 연결하십시오. 연결 확인을 구성하려면 ftype /?
은 많은 정보를 제공합니다.
일반 .cs 파일과 혼동되지 않도록 기본 .cs (즉 .cssript) 대신 사용자 정의 확장자를 사용하는 것이 좋습니다.
당신이 찾고있는 것은 CSharpCodeProvider입니다.
소스의 C# 코드를 컴파일하거나 평가하여 실행할 수 있습니다. 그것은 비행 중에 그리고 다른 과정에서 그것을 할 수 있습니다.
나는 그렇게 생각하지 않는다. 나는 csc.exe를 컴파일하는 코드를 편집 할 생각이다. –
@AkshayJ : 코드를 컴파일하는 작업을하는 응용 프로그램을 만든다. 원할 때 작업 스케줄러에게 해당 응용 프로그램을 실행하도록 요청 하시겠습니까? – LightStriker
왜 csc를 사용해야합니까? CSharpCodeProvider는 정확한 어셈블리 결과를 제공합니다. – Martheen
소스 코드가 제공된 here의 좋은 예가 있습니다. 기본적으로 cs 파일을 실행하는 exe 인 러너를 만듭니다.
러너는 콘솔 응용 프로그램입니다. CS 파일을 매개 변수로 전달하기 만하면됩니다. 한가지주의 할 점은 클래스 이름을 "CSScript"로 지정해야한다는 것입니다. 그러나 그것은 다음과 같은 클래스처럼 보일 것입니다. 이 링크는 CSharpCodeProvider 클래스를 사용하여 소스 코드를 즉시 컴파일합니다.
이 예제는 전달 된 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
컴파일 된 코드를 사용하고 싶지 않습니다. 모든 것은 평문으로 작성되어야합니다. 코드를 컴파일하기 전에 코드를 exe 파일로 컴파일해야합니다. –
불행히도 스크립트 파일을 실행하려면 실행 파일이 필요합니다. php.exe를 사용하는 PHP의 경우 vbs에서 CScript.exe (또는 system32 폴더의 WScript.exe)를 사용합니다. Windows에서 vbs 파일을 참조하지 않고 자동으로 실행하는 유일한 이유는 해당 파일 형식이 CScript.exe 실행 파일과 연결되어 있고 CScript.exe가 시스템 경로에 있기 때문입니다. – nerdybeardo
나는 배치 파일을 csc.exe를 호출하고 그 출력을 호출 할 필요가 있다고 생각한다. –
이것은 하나의 자기 컴파일 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 샘플.
"작업 관리자에 있습니까?" –
@AlexeiLevenkov Corrected –