3

私のゲーム (これも C# で記述されています) に、何らかのカスタマイズ サポートを含めたいと考えています。ゲームプレイの大部分をスクリプトにオフロードすることを計画しているため、速度は大きな懸念事項です。その結果、ゲーム内イベントなどのスクリプト作成に C# を使用することにしました。また、ユーザーは C# でゲームのスクリプトとアドオンを記述できる必要があります。(私は、C# がスクリプト言語ではないことを知っています。)

ゲームと対話するために必要なすべての機能を含む (静的) クラスをユーザーに提供します。ユーザーはコードをソースとして提供することもできます (その場合、ゲームはそれをコンパイルします)。 コンパイルされたユーザー「スクリプト」は、場合によっては他のプレイヤーに送信される可能性があります。たとえば、ユーザーは自分の家などにスクリプト化されたトラップを構築できます。

ここに私の質問があります:

  1. 安全

    提供されたコードが、提供された API (クラス) の呼び出しのみを強制されるようにするにはどうすればよいですか? スクリプトによる不正行為や悪意のある行為を防ぐために...

    コンパイルされたコードを一種の VM または低信頼環境で実行する方法はありますか??

  2. スピード

    このアプローチは十分に高速ですか?(毎秒または毎秒のフレームで最大 100 個のカスタム アセンブリから関数を呼び出します)。これに関するヒントはありますか?

    すべてのユーザー コンテンツを 1 つの大きなアセンブリなどにコンパイルすることで、速度の利点を得ることができるのではないでしょうか??

  3. サイズ

    コンパイルされたコードのサイズを小さくするにはどうすればよいですか (圧縮する以外に) ? プレイヤーは何十ものスクリプトをダウンロードする必要があるかもしれないので...

    絶対に必要ではないものを取り除く方法はありますか? デバッグ情報やクラス名など...

ランタイム コンパイルは私にとってかなり新しいものです (そのため、ここで質問します)。したがって、いくつかの主要な初心者の間違いやセキュリティ上の懸念を指摘していただけると幸いです。

編集:

明確にするために:ユーザープラグイン/スクリプトまたはそれを呼び出したいものは、「GetAddonInfo」、「Init」、「Update」などの特定の機能を実装する必要があるクラス(C#でも記述)になります...私の抽象「アドオン」クラスから派生した通常の C# クラス。

4

2 に答える 2

5

古いマイクロソフトのサンプル プロジェクトのこのリワークを見てみたい

http://terrarium2.codeplex.com/

それは基本的にあなたが望むすべてを行います。

コードを DLL にコンパイルし、環境で実行します。

許可された API 呼び出しをチェックします。

バージョン 2 は、Web サービスやその他の多くの機能を利用できるように書き直されました。あなたの質問から、あなたは Terrarium 1 にもっと興味を持っているように思えます。しかし、私はそれを追跡できないようですので、より複雑な 2.0 リリースに「落ち着く」必要があるかもしれません。

于 2011-08-22T02:13:54.007 に答える
3

MEF と MAF を調べてください。どちらも既存のアプリケーションに C# と VB のスクリプトを追加するために設計されたフレームワークです。スクリプト用の appdomain を作成し、コード アクセス セキュリティを使用して、それらのスクリプトが実行できることを厳しく制限できます。

この質問が役立つかもしれません。

MEF と MAF の選択 (System.AddIn)

于 2011-08-22T02:57:20.823 に答える