2012-02-08 10 views
1

私はマネージ.NET DLL /クラスライブラリを呼び出すTcl拡張を作成する必要があります。現在、私のアプリケーションの構造はです。Tcl> DLL Wrapper(C++ CLR)>。NET Class Library(VB.NET)、ここで ">"は関数呼び出しを表します。TclエクステンションVB.NET DLLを呼び出す

私のVB.NET DLLはちょうど価値を取り戻し、それを元に戻します。結局のところ、これはいくつかの.NET機能を利用するいくつかの高度な機能を提供します。

Public Class TestClass 
    Public Function TestFunction(ByVal param As Integer) As Integer 
     Return param 
    End Function 
End Class 

私のTcl拡張(C++ CLR)は

int TestCmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 
{ 
    // Check the number of arguments 
    if (objc != 2) { 
     Tcl_WrongNumArgs(interp, 0, objv, "arg"); 
     return TCL_ERROR; 
    } 

    int param, result; 

    if (Tcl_GetIntFromObj(interp, objv[1], &param) != TCL_OK) 
     return TCL_ERROR; 

    SimpleLibrary::TestClass^ myclass = gcnew SimpleLibrary::TestClass(); //System.IO.FileNotFoundException 
    result = myclass->TestFunction(param); 

    Tcl_SetObjResult(interp, Tcl_NewIntObj(result)); 
     return TCL_OK; 
} 

上型のオブジェクトを作成し、そして最後に、私のTclスクリプトは、拡張子をロードし、関数を呼び出します。

load SimpleTclExtension.dll 
TestCmd 2 

私のVB.NET DLLが拡張DLLと同じディレクトリにある場合、TestClassオブジェクトをインスタンス化するときに拡張がクラッシュします。 VB.NET DLLがC:\ Tcl \ binに再配置された場合、となり、TestCmdは正常に呼び出せます。問題は、最終的には複数のPCに展開する必要があり、アプリケーションのファイルを別のアプリケーションと混用したくないということです。

この問題を解決する設定がいくつかあるようですが、どこがわからないのですか。どんな助けでも大歓迎です。

答えて

1

まず、使用しているTclアプリケーションの種類によっては、CLRのTclの実装であるEagleを見てみるとよいでしょう。

私はあなたのアプリケーションのディレクトリまたはその直下のサブディレクトリからアセンブリを読み込むことを望んでいると思います。ここのアプリケーションはtclsh/wish実行可能ファイルなので、.Netアセンブリを動かすと負荷がかかります。これは、適切なマニフェストやAPIへの呼び出しで修正できるもので、別の場所からのアセンブリの読み込みを許可します。この場合、TclインタープリタにロードされてCLRを初期化し、アセンブリをロードするのに適した場所として拡張ロケーションを追加するときに、Tcl拡張でいくつかの初期化コードを実行する必要があると思います。詳細を忘れてしまったので、私はこれを見てからしばらくしていましたが、AppDomainオブジェクトを見て、そのオブジェクトまたはその子オブジェクトに関連付けられているアセンブリロードパスプロパティを確認したいと思います。具体的にはAppDomain.RelativeSearchPath

+0

から.NETを呼び出すできるように構築されたTcl拡張であるガルーダが含まれますが、私はAppDomain.RelativeSearchPathを使用してディレクトリを指定します方法についていくつかの詳細を持っていますか? – jags0333

0

を試してみて、イーグルは、特にTclの

+0

私が読んだことから、イーグルにはTkは含まれていません。残念なことに、それはこの特定のプロジェクトのためのディール・ブレーカーです。 – jags0333

+0

@ jags0333イーグルはガルーダではなく、ガーダはイーグルには含まれていません。彼らは非常に異なっています。 –

関連する問題