2012-04-19 65 views
1

我正在用C#编写并希望使用tcl。从.NET程序集中加载用C(DLL)编写的Tcl包

搜索后,我发现Tcl/Csharp项目做的工作,但是缺少一个允许它与注册表一起使用的包。我有包dll文件的形式,但我的“M无法加载它。

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个人中有没有花时间去实现它。如果你需要这样做,那么你必须弄脏你的手。 – 2012-04-19 18:09:25

+1

也许你也会感兴趣的是Eagle(http://eagle.to/),它是CLR/.NET运行时更全面的Tcl。 – schlenk 2012-04-19 18:53:12

+0

@schlenk您能指导我举例说明如何与老鹰合作吗? – DoctorBurp 2012-04-24 09:10:31

回答

2

由于M.Babcock正确地指出,那的Tcl/Csharp的包你正在使用的只是一个试图在.NET堆栈上实现Tcl解释器,但load命令是非常特殊的,因为它(在“真正的”Tcl中)是用来加载用C编写的Tcl包,这样的软件包应该使用C API exposed by the Tcl runtime本身。这个C API非常全面,当然,使一个纯.NET代码正确地模拟所有C API的东西将是一个巨大的任务,如果在所有的位置锡布尔赫丁。由于Windows注册表操作在.NET中被微不足道地完成,我想你有一个用Tcl编写的大型遗留程序,你需要从你的.NET程序中调用(因为你可能估计移植该程序会是比让它按原样运行更麻烦)。如果这是真的,我会采取这些途径之一:

  • 将您的程序转换成​​和捆绑你的“主持人”节目沿生成的可执行文件,那么就执行它作为一个单独的程序。 (该文件将是单一的,并没有特别的依赖关系。)
  • 编写一个特殊的包装程序集,它将使用P/Invoke加载真正的Tcl运行时(Tcl的shell,tclshXY.exe只是一个瘦程序,实际是tclXY.dll加上一个一组库文件,这是你应该加载的DLL)。然后你的代码可以通过Tcl运行时脚本(以字符串的形式),它将加载并执行你需要运行的实际Tcl程序。
+1

如果您使用P/Invoke加载Tcl库,请确保首先在其中调用'Tcl_FindExecutable';它的参数应该是NULL(因为在正常意义上没有shell可执行文件)。之后,'Tcl_CreateInterp'给出了一个解释器引用,它可以在整个API的其余部分中使用(尽管注意Tcl解释器与其创建者线程紧密绑定;不会在另一个线程中使用)。 – 2012-04-20 08:39:04

+0

我发现了一些使用p/invoke方法的TCL包装,并且写了一个我的自我,但是我在获取正在写入/读取的内存异常时进行了捕获。 – DoctorBurp 2012-05-01 07:47:18

相关问题