私のゲーム (これも C# で記述されています) に、何らかのカスタマイズ サポートを含めたいと考えています。ゲームプレイの大部分をスクリプトにオフロードすることを計画しているため、速度は大きな懸念事項です。その結果、ゲーム内イベントなどのスクリプト作成に C# を使用することにしました。また、ユーザーは C# でゲームのスクリプトとアドオンを記述できる必要があります。(私は、C# がスクリプト言語ではないことを知っています。)
ゲームと対話するために必要なすべての機能を含む (静的) クラスをユーザーに提供します。ユーザーはコードをソースとして提供することもできます (その場合、ゲームはそれをコンパイルします)。 コンパイルされたユーザー「スクリプト」は、場合によっては他のプレイヤーに送信される可能性があります。たとえば、ユーザーは自分の家などにスクリプト化されたトラップを構築できます。
ここに私の質問があります:
安全
提供されたコードが、提供された API (クラス) の呼び出しのみを強制されるようにするにはどうすればよいですか? スクリプトによる不正行為や悪意のある行為を防ぐために...
コンパイルされたコードを一種の VM または低信頼環境で実行する方法はありますか??
スピード
このアプローチは十分に高速ですか?(毎秒または毎秒のフレームで最大 100 個のカスタム アセンブリから関数を呼び出します)。これに関するヒントはありますか?
すべてのユーザー コンテンツを 1 つの大きなアセンブリなどにコンパイルすることで、速度の利点を得ることができるのではないでしょうか??
サイズ
コンパイルされたコードのサイズを小さくするにはどうすればよいですか (圧縮する以外に) ? プレイヤーは何十ものスクリプトをダウンロードする必要があるかもしれないので...
絶対に必要ではないものを取り除く方法はありますか? デバッグ情報やクラス名など...
ランタイム コンパイルは私にとってかなり新しいものです (そのため、ここで質問します)。したがって、いくつかの主要な初心者の間違いやセキュリティ上の懸念を指摘していただけると幸いです。
編集:
明確にするために:ユーザープラグイン/スクリプトまたはそれを呼び出したいものは、「GetAddonInfo」、「Init」、「Update」などの特定の機能を実装する必要があるクラス(C#でも記述)になります...私の抽象「アドオン」クラスから派生した通常の C# クラス。