2012-04-19 95 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