Program1.exe という名前のアプリケーションがあるとします。その exe をクリックすると、そのプログラムは別の exe を作成する必要があり、画面に「hello world」と表示される Program2.exe とします。したがって、コードでcscコマンドを使用してビジュアルスタジオのコマンドラインツールを使用することは可能だと思いますが、可能な場合、Program2.exeがProgram1.exeを置き換えることができますか? Program1.exe は実行時に再コンパイルできるということですか?
2 に答える
これができることを確認してください。クラスを見てください:Microsoft.CSharp.CSharpCodeProvider
およびこの記事:実行時のコードのコンパイルと実行
PSコードからcscコマンドを実際に呼び出しているわけではありませんが、私の理解では、それよりもはるかに低いものです...とにかく、外部ツールではなくマネージドクラスを使用するので、これは良いことです。
Program1.exe が実行されている間、Windows はファイルへの書き込みアクセスを拒否する必要があります... 私があなたの質問を正しく理解していれば、間違いなくそれは正しい方法ではないと思います。実行時に自分自身を変更するには、プログラムは何らかの形式のリフレクションを使用する必要があります。
効率的にやりたい場合は、Emitを見てください。これにより、完全なバイトコード アクセス パワー (および関連する危険) が得られます。数年前、私は CodeProject のプロジェクトを使用して、詳細を理解するのに役立ちました。私は.NET 2.0に取り組んでいましたが、今では確かにもっと最近のものがあります(このような)。
または、 CSharpCodeProviderを使用して、アセンブリをビルドしてロードすることもできます (ソースからコンパイルするか、ツリー表現からコンパイルします)。
csc を使用してアセンブリをコンパイルし、それを実行中のプログラムにロードすることもできます。このように進むと、アセンブリの読み込みに注意が必要になります。このリンクは役に立つかもしれません。