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 中很简单,我想您手头有一个用 Tcl 编写的大型遗留程序,您需要从您的 .NET 程序中调用它(因为您可能估计移植该程序比制作更麻烦)它按原样运行)。如果这是真的,我会采取以下路线之一:

  • 将您的程序变成一个starpack,并将生成的可执行文件与您的“主机”程序捆绑在一起,然后将其作为单独的程序执行。(该文件将是单一的,没有特殊的依赖关系。)
  • 编写一个特殊的包装程序集,它将使用P/Invoke加载真正的 Tcl 运行时(Tcl 的外壳,tclshXY.exe只是一个瘦程序,真正的东西是tclXY.dll加上一组库文件,这是你应该加载的 DLL )。然后,您的代码可以将一个脚本(以字符串的形式)传递给 Tcl 运行时,该脚本将加载并执行您需要运行的实际 Tcl 程序。
于 2012-04-19T21:34:45.020 回答