从.NET程序集加载用C(DLL)编写的Tcl包

时间:2012-04-19 17:26:00

标签: c# .net tcl

我正在用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();
    }
}

我该如何使用这个包?

1 个答案:

答案 0 :(得分:2)

正如M.Babcock正确指出的那样,你正在使用的Tcl / Csharp包只是尝试在.NET堆栈之上实现一个Tcl解释器,但load命令非常特殊,因为它(在“真正的”Tcl中)旨在加载用C,编写的Tcl包,这些包应该使用C API exposed by the Tcl runtime本身。这个C API非常全面,当然,如果可能的话,使纯CSS代码正确地模拟所有C API的东西将是一项巨大的任务。

由于Windows注册表操作在.NET中很简单,我想你有一个用Tcl编写的大型遗留程序,你需要从你的.NET程序中调用它(因为你可能估计移植该程序会更多)麻烦而不是让它按原样运行)。如果这是真的,我会选择其中一条路线:

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