1

私は C# で書いていて、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();
    }
}

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

4

1 に答える 1

2

M.Babcock が正しく指摘したように、あなたが使用している Tcl/Csharp パッケージは、.NET スタックの上に Tcl インタープリターを実装しようとする試みにすぎませんが、loadコマンドは非常に特殊です (「実際の」Tcl で)。 C で記述された Tcl パッケージをロードすることを目的としておりそのようなパッケージは、Tcl ランタイム自体によって公開された C API を使用することになっています。この C API は非常に包括的であり、当然のことながら、純粋な .NET コードですべての C API を適切にエミュレートすることは、可能であれば非常に大きな作業になります。

Windows レジストリの操作は .NET で簡単に行われるため、.NET プログラムから呼び出す必要がある Tcl で記述された大規模なレガシー プログラムが手元にあると思います (おそらく、そのプログラムを移植することは、そのまま実行されます)。これが本当なら、私は次のいずれかのルートをとっていたでしょう。

  • プログラムをスターパックに変換し、結果の実行可能ファイルを「ホスト」プログラムと一緒にバンドルしてから、別のプログラムとして実行します。(そのファイルは単一で、特別な依存関係はありません。)
  • P/Invokeを使用して実際の Tcl ランタイムをロードする特別なラッパー アセンブリを作成します (Tcl のシェルtclshXY.exeは単なる薄いプログラムであり、実際tclXY.dllには一連のライブラリ ファイルが追加されており、これがロードすることになっている DLL です)。 )。次に、コードは、実行する必要がある実際の Tcl プログラムをロードして実行するスクリプトを (文字列の形式で) Tcl ランタイムに渡すことができます。
于 2012-04-19T21:34:45.020 に答える