STL.NETはC#から使えるか?
そろそろ話題も無くなってきたのでネタ企画。(^^;
まず、テンプレートライブラリはヘッダで提供されているので、当然C#から使えないのでコンパイルしてアセンブリにしなければなりません。また、STL.NETのクラスはプライベートな型になっていてアセンブリの外へ公開されません。なので、まずは、cliext以下のファイルを改変してクラスを皆publicにします。次に、アセンブリの作成。
#include <xxx/vector> using namespace System; using namespace cliext; namespace mei { void dummy() { vector<char>^ vc = gcnew vector<char>(); vector<wchar_t>^ vw = gcnew vector<wchar_t>(); vector<short>^ vs = gcnew vector<short>(); vector<int>^ vi = gcnew vector<int>(); vector<long long int>^ vl = gcnew vector<long long int>(); vector<float>^ vf = gcnew vector<float>(); vector<double>^ vd = gcnew vector<double>(); vector<String^>^ vS = gcnew vector<String^>(); } }
こんなダミーソースをコンパイルしてアセンブリを作成します。取りあえず、出来たアセンブリをReflectorで覗いてみると、
[DefaultMember("Item")] public class vector<int> : vector_base<int>, ICollection<int> { // Methods public vector<int>(); public vector<int>(vector_interface<int> _Right); public virtual void Add(int _Val); public virtual void Clear(); public override object Clone(); [return: MarshalAs(UnmanagedType.U1)] public virtual bool Contains(int _Val); public virtual void CopyTo(int[] _Dest, int _First); public virtual IEnumerator<int> GetEnumerator(); [return: MarshalAs(UnmanagedType.U1)] public virtual bool Remove(int _Val); // Properties public virtual bool IsReadOnly { [return: MarshalAs(UnmanagedType.U1)] get; } }
一応、それっぽいのが出来ています。ただ、クラス名がvector
で、C#から呼び出してみる。
using System; using System.Runtime.Remoting; class Program { static void Main(string[] args) { // 型が見つからない // cliext.vector<int> v = new cliext.vector<int>(); ObjectHandle h = Activator.CreateInstance("cliext", "cliext.vector<int>"); Console.WriteLine(h.Unwrap()); } } /* 結果 cliext.vector<int> */
ごらんの通り駄目でした。展開したテンプレートクラスがvector
Activator経由からだと呼び出せるよーですが、それじゃ使えないです。ということで実験は失敗でした。(^^;