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

本文关键字:Tcl DLL 程序集 NET 加载 | 更新日期: 2023-09-27 18:31:45

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

如何使用此软件包?

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

正如 M.Babcock 正确指出的那样,您使用的 Tcl/Csharp 包只是尝试在 .NET 堆栈之上实现 Tcl 解释器,但 load 命令非常特殊,因为它(在"真正的"Tcl 中)旨在加载用 C 编写的 Tcl 包,并且此类包应该使用 Tcl 运行时本身公开的 C API。 这个 C API 非常全面,当然,如果可能的话,制作一个纯 .NET 代码来正确模拟所有 C API 内容将是一项艰巨的任务。

由于Windows注册表操作是在.NET中轻松完成的,因此我想您手头有一个用Tcl编写的大型遗留程序,您需要从.NET程序调用该程序(因为您可能估计移植该程序比使其按原样运行更麻烦)。 如果这是真的,我会采取以下路线之一:

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