2017-03-10 22 views
-1

自分のゲーム用のシンプルなゲームエンジンを作りたいと思っています。スクリプトシステムをサポートしたいと思っています。外部モジュールから関数を参照する方法は?

私は自分のスクリプト言語をC#コードにコンパイルし、メインアプリケーションによってロードされたDLLモジュールとしてビルドします。しかし、ここにはいくつかの問題があります。

  1. 実行時にコンパイルされたDLLをリンクするにはどうすればよいですか?

    「参照」で使用するモジュールをリンクできます。実行時にプログラムでDLLをリンクする方法はわかりません。

  2. など、メインアプリケーションの機能、または変数を参照するためにロードされたモジュールを作ることができますどのように...

    ロードされたモジュール(コンパイル済みスクリプト)(まあ、私はそれが正しいのかどうかわかりませんメインアプリケーションのメンバーを呼び出す必要があります表現かどうか)...それは目的のためです。

どのようにこれらの問題を解決できますか?この問題は、外部ライブラリではなく、純粋なC#(または.NET Framework)で解決されることを願っています。

ありがとうございました!

+0

実行時にリンクする必要がありますか?アプリケーションから参照するだけであれば、アプリケーションのコーディングが非常に簡単になります。 – Slepz

+0

これは非常に広範な質問であり、Stack Overflowについては広すぎます。 – DavidG

+0

Slepz /はコンパイルされたゲームスクリプトです。 –

答えて

0

あなたの質問は、コードに関連するものよりもアーキテクチャーです。

まず、トランスペラレータ(ある言語を別の言語に翻訳するコード)を書くのは大変な作業です。しかし、C#をオンザフライでコンパイルするのは簡単です。これにRoslynを使うことができます。すばらしいチュートリアル:http://www.tugberkugurlu.com/archive/compiling-c-sharp-code-into-memory-and-executing-it-with-roslynについては、この記事をご覧ください。

次に他の問題があります。 DLLを取得したら、メインのAppDomainにDLLをロードする必要があります。それは非常に簡単です。ちょうどAssembly.Load(...)メソッドを使用してください。ここにいくつかの例があります:https://msdn.microsoft.com/en-us/library/25y1ya39(v=vs.110).aspxしかし、DLLをAppDomainにロードしたら、アンロードすることはできません。トリックを使用しない場合は、DLLをアプリケーションのメインAppDomainにロードします。その後、DLL内のコードを変更すると、それを取り除くことはできません。唯一の方法は、もう一度アプリケーションを閉じて起動することです。それ以外の場合は、別のAppDomainにDLLをロードする必要があります。

ここで、アプリケーション機能を参照する方法。このためにはinterfaceを作成する必要があります。インターフェイスに準拠したクラスでアプリケーション関数をコーディングし、このクラスのインスタンスを別のクラスに渡して、動的にロードされたDLLからロードしてインスタンス化します。

上記のようにDLLをロードすると、何も役に立ちません。 DLLからクラスのインスタンスを作成する必要があります。これにはActivator.CreateInstance(...)を使用できます。作成しようとしているクラスへのパラメータとして、上記のように作成したインタフェースに準拠したクラスインスタンスが渡されます。参考までに、このソフトウェア開発パターンは「戦略」と呼ばれています。

+0

「Assembly.Load」に頼るのではなく、MEFを調べることをおすすめします – DavidG

0

実行時にコンパイルされたDLLをリンクするにはどうすればよいですか?

「参照」で使用するモジュールをリンクできます。しかし、私は DLLを実行時にプログラム的にリンクする方法を知っていません。

reflectionを使用して、指定されたフォルダからDLL(プラグインとして)を動的に読み込む必要があります。例はherehereです。

メインアプリケーションの機能を参照するためにロードされたモジュールを作る、または 変数などをすることができますどのように...

ロードされたモジュール(コンパイル済みスクリプト)が(まあ、私は知らないメインアプリケーションの メンバーを呼び出す必要がありますそれが正しい表現であるかどうかは問わない)。 の目的である。

フレームワークのインターフェイスに対してこれらのDLLをコーディングする必要があります。プラグインにフレームワークの呼び出しを依頼するのではなく、フレームワークが呼び出す必要があります。