2012-04-19 10 views
1

私はC#で書いているので、tclを使いたいです。.NETアセンブリからC(DLL)で書かれたTclパッケージをロードする

検索後、私はジョブを実行するTcl/Csharpプロジェクトを見つけましたが、レジストリで動作するようにするパッケージがありません。私は、DLLファイルの形でパッケージを持っているが、私は「それをロードすることができませんでしメートル。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Interp interp = new Interp(); 

     interp.eval("puts hello world");  // Works 
     interp.eval("load tclreg12.dll"); // Throws TclException Invalid command name "load" 
     interp.eval("package req registry"); // Throws TclException "cant find package registry" 

     TclObject result = interp.getResult(); 
     Console.WriteLine(result); 

     interp.dispose(); 
    } 
} 

どのように私はこのパッケージを使用することができますか?

+1

他のものとしてマスクされていない限り、 'load'コマンドはまだ定義されていないようです(http://tclcsharp.cvs.sourceforge.net/viewvc/tclcsharp/tcl/commands/ )、私は実際にこのライブラリをダウンロードした3人のうちのどれかがそれを実装するのに時間がかかっているとは確信していません。これを行う必要がある場合は、手を汚す必要があります。 –

+1

興味深いのは、CLR/.NETランタイムでより包括的なTclであるEagle(http://eagle.to/)です。 – schlenk

+0

@schlenkあなたはイーグルで働く方法を示す例を教えていただけますか? – DoctorBurp

答えて

2

M.Babcockが正しく、そのTcl/CSHARPパッケージを指摘したように使用しているのは、.NETスタックの上にTclインタープリタを実装しようと試みたものですが、loadコマンドは非常に特殊です(「実際の」Tclでは)Cで書かれたTclパッケージをロードすることを意図しています。そのようなパッケージは、C API exposed by the Tcl runtime自体を使用することになっています。このC APIは非常に包括的です。純粋な.NETコードであれば、C APIのすべてのものを正しくエミュレートできますシブル

.NETでWindowsのレジストリ操作が簡単に行なわれているので、Tclで書かれた大規模なレガシープログラムを手元に置いていると思いますが、.NETプログラムから呼び出す必要があります(おそらく、それをそのまま実行するよりも面倒です)。これが本当であるならば、私はこれらのルートの1つを取っているだろう:

    は​​にあなたのプログラムを回して、あなたの「ホスト」プログラムと一緒に結果の実行可能ファイルをバンドルし、そしてちょうど別のプログラムとして実行
  • P/Invokeを使用して実際のTclランタイム(Tclのシェル、tclshXY.exeは単なる薄いプログラムです)をロードする特別なラッパーアセンブリを書くと、実際にはtclXY.dllにaを加えたものになります(このファイルには特別な依存関係はありません)。ライブラリファイルのセット、これはあなたがロードされるはずのDLLです)。その後、あなたのコードはTclランタイムに、実行する必要がある実際のTclプログラムをロードして実行するスクリプト(文字列の形式)を渡すことができます。
+1

P/Invokeを使ってTclライブラリをロードする場合は、最初に 'Tcl_FindExecutable'を呼び出してください。それへの引数はNULLでなければなりません(通常の意味で実行可能なシェルはないので)。その後、 'Tcl_CreateInterp'はAPIの残りの部分で使用できるインタープリタリファレンスを与えます(Tclインタプリタは作成者スレッドに密接に結び付けられていますが、別のスレッドでは使用されません)。 –

+0

私はp/invokeの手法を使ったTCLラッパーをいくつか見つけ出しましたが、自分自身も書きましたが、書き込み/読み込み中のメモリの例外を取得することでキャプチャします。 – DoctorBurp

関連する問題