奇妙な要件があります。プレーンテキストであるため、VBScriptで特定の検証スクリプトをコーディングするように求められました。しかし、私はC#の方が快適です。したがって、コンパイラがプログラム(.csファイルのソースコード)をコンパイルしてオンザフライで実行するように、タスクスケジューラでスケジュールする方法はありますか。
4 に答える
これは、単一の自己コンパイル型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#コンパイラでは無視されます。バッチ(CMD)ファイルはエラーをスキップして次の行に移動するため、このファイルはテキストであることを除けばEXEのように実行されます。改良点として、/out
ターゲットを%TEMP%のどこかに変更することをお勧めします。
[更新]よりシンプルなHelloWorldサンプル。
あなたが探しているのはCSharpCodeProviderです。
これにより、ソースからC#コードをコンパイルまたは評価して実行できます。それはその場でそして別のプロセスからそれをすることができます。
通常のEXEファイルと同様に動作するコマンドラインでVBScript/JavaScriptと同様の動作が必要であると想定します。JS / VBSがどのように実行されるかを確認するにはassoc .js
、ftype JSType
コマンドの出力を確認してください。
基本的には、CSCを起動して.csファイルをコンパイルし、CMDファイルのすべての元のパラメーターを使用して実行可能ファイルを実行するCMD/BATファイルを作成する必要があります。この新しいCMDファイルを.CSファイルタイプに関連付けるよりも。アソシエーションを設定するには、チェックftype /?
で多くの情報を提供します。
通常の.csファイルとの混同を避けるために、デフォルトの.cs(つまり、.cssript)の代わりにカスタム拡張子を使用することをお勧めします。
ここ にソースコードが提供された素晴らしい例があります。基本的に、csファイルを実行するexeであるランナーを作成します。
ランナーはコンソールアプリケーションです。CSファイルをパラメータとして渡すだけです。注意点の1つは、クラスに「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