私は C# で IRC ボットを作成しています。プラグインをロードする機能が必要です。たとえば、コードを含むテキスト ファイルがあり、プログラムはそのテキスト ファイルの内容をインポートします。 AS CODE...関数に...これはどのように可能ですか?
5 に答える
私はMUD サーバーに対して同じことをしています。このサーバーには、コンパイルされたプラグインと、使用したいコード プラグインの両方があります。CodeDom を使用して独自のスクリプト エンジンを作成しましたが、これはかなり面倒でした。最終的にCS-Scriptに切り替えました。そのため、コンパイル済みプラグインにはMEFを使用し、コード プラグインには CS-Script を使用しています。
I suggest either using C#-script or some DLR language like IronPython (I'd prefer the latter). But, as others pointed out, it is unsafe to run any code that your program recieves - a more wise idea would be to define a contract interface, and accept the plugins (implementing that interface) in signed assemblies.
CSharpCodeProvider
クラスを調べてみてください。この質問にはいくつかのサンプルコードがあります。
これ以外に、dllをプリコンパイルし、実行時バインディングを使用してそれらをロードするオプションがあります。
これ以外に、Luaのようなスクリプトエンジンをプログラムに埋め込むことができます。
簡単に言えば、利用可能なあらゆる種類のオプションがあります。それは、どのソリューションが最適であるかについて、達成しようとしていることによって異なります。
最初の2つの例では、インターフェイスプログラミングを見て、コンパイルできる2番目のdllでインターフェイスを定義し、リフレクションを介してアセンブリから事前に定義された名前を引き出し、それを変数に割り当てます。インターフェイスタイプのとそれに対して呼び出しを行います。
私はLuaを使ったことがありませんが、リンクした記事でもその使い方を説明しているはずです。
動的なコードコンパイルを探す必要があります(http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm、http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/articleを参照してください) 。 php / c10729 /、http://www.codeproject.com/KB/cs/Dynamic_Code_Generation.aspx)
代わりに、リフレクションを介してプラグインをDLLとしてロードする方が良いと思いませんか?動的コードは署名されないため、コードが信頼できるソースからのものであることを確認する方法がなく、プログラムのユーザーを非常に悪意のあるコードにさらす可能性があります。
助けてくれてありがとう、しかしインポートされたコードとメインコードの間でコードを共有しようとしています、例えば、テキストファイルがあり、メインプログラムのロード時に、それはそのテキストファイルを開いて関数としてロードします...パブリック文字列やintなどのコードを共有し、他の関数をアクティブにしてコマンドを使用したり、オブジェクトなどを使用したりできる関数...これは可能ですか?