Created
June 6, 2012 03:39
-
-
Save mfakane/2879744 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1. C# を組み込みスクリプトにできるのか | |
場合による。 | |
基本的にホストが .NET 上で動くものであればそれほど難しくはないが、ネイティブから呼び出すにはいくらか変則的な手法を用いる必要がある。これについては後述。 | |
C# の実行時コンパイルにより動的にコードを実行する手法はよく見られ、.NET のライブラリにそのための機能は存在する。 | |
コンパイルして生成された dll (.NET アセンブリ, Assembly) を動的に読み込み呼び出すことで既存のコンテキストでコードを実行できる。 | |
また、最近では Microsoft の "Roslyn" や、Mono の Mono.CSharp.dll などコンパイラをサービスとして公開することでスクリプト的な使用方法をより簡単にする動きがある。 | |
ただし、C# はスクリプト言語ではない。 | |
2. Unity とか PSS とか | |
開発言語自体が .NET の言語 (C#) で、ライブラリが .NET ベースであり、おそらく生成される実行可能形式も .NET アセンブリであることから、 | |
.NET の互換環境 mono 上に構築されているものであり、そこからネイティブ層を呼び出すことによって実現していると思われる。 | |
あくまでホスト側が .NET である。 | |
3. ネイティブに CLR をロードできるか | |
VM と言っていますが、実行環境を指すなら .NET では CLR に当たるかな? | |
CLR はネイティブとの相互運用がそこそこ強力でありますが、多くは .NET 側からネイティブへの呼び出しの対応であり、逆はあまり多くない。 | |
ネイティブから CLR の世界へ入る主な方法としては以下の二つが考えられる。 | |
・CLR のホスティング | |
・混合モードのアセンブリを読み込む | |
「CLR のホスティング」は、その名の通り CLR Hosting API によって CLR をネイティブプロセス内で動かすものである。 | |
ただし、MS の中の人以外で使っている例は本当に少ないし、資料もない。http://d.hatena.ne.jp/NyaRuRu/20060616 曰く、「MSDN に正確な仕様が書いてないぐらい」ない。 | |
よって間違ってもおすすめできない。 | |
ちなみに、mono にも組み込み用の API があるが、Microsoft .NET Framework の API とはかなり別物らしい。 | |
http://www.mono-project.com/Embedding_Mono | |
次に「混合モードのアセンブリを読み込む」は、.NET のコードとネイティブコードが混ざった .NET アセンブリを使用し、 | |
dllexport された関数を任意のネイティブホストから呼び出し、その関数が .NET コードを呼び出すことで自動的に CLR がロードされる仕組みを利用することである。 | |
混合モードのアセンブリは C++/CLI によって作り出せるほか、裏技的手法として「逆 P/Invoke」と呼ばれるものによって C# などの .NET 言語による関数を | |
直接 C 互換関数として dllexport するものがある。後者については資料が少なく少々面倒なため、どうしても C# だけでやりたい場合でなければ前者で。 | |
C++/CLI ではネイティブなコードも .NET 上で動くコードも混在して書けるが、主に必要となるのはネイティブとのブリッジ部分だけである。 | |
呼び出せるようにしたいネイティブ側の部分を .NET から呼び出せるようにするラッパーを書くことになるだろう。 | |
また、.NET には P/Invoke という dllimport 機構があるため、ネイティブ部で dllexport するのと同じように関数を公開できれば C# 上でラッパーを構築することも可能である。 | |
ラッパーができたら、渡された文字列を C# コンパイラに渡し、出来上がった .NET アセンブリをロードして呼び出すことになるだろう。 | |
これは .NET 上の作業であるため、単に C++/CLI 部分を C# コードを呼び出すだけにして、あとはすべて C# 上でやっても構わない。 | |
また、この方法でロードできる CLR は一つのみであるが、基本的にプロセス一つあたりひとつであり、 | |
CLR の中で AppDomain や Assembly などでさらに切り分けられているので、複数のスクリプトインスタンスの管理は .NET 上で行うこととなる。 | |
クラスで扱えば済む話であるので複数の VM を持つみたいな考えはあまり利点はない。 | |
これらの作業に .NET および C# の知識が要求されるのは言うまでもないだろう。 | |
4. suspend および resume | |
マイクロスレッドや継続の話であれば、ループ部分などは C# では yield や await 等の仕組みで疑似的にそのようなことが実現できる。 | |
任意のタイミングで実行状態の保存および復元をしたい場合は状態の保存や復元は自前になるだろう。 | |
5. 最後に | |
C# を実行時に実行したい場合は、値の受け渡しなどの手間を考えるとホスト自体を C# で書いてしまったほうが楽なのではないかと。 | |
それと、C# はスクリプト言語ではない。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment