Tcl扩展调用VB.NET DLL

时间:2012-02-08 15:16:26

标签: c++ vb.net clr tcl

我需要创建一个调用托管.NET DLL /类库的Tcl扩展。目前,我的应用程序的结构是 Tcl> DLL包装器(C ++ CLR)> .NET类库(VB.NET),其中“>”表示函数调用。

我的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上部署,并且最好不要将我的应用程序文件与其他应用程序混合。

似乎应该有一些配置设置可以解决这个问题,但我不知道在哪里。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

首先,根据您使用的Tcl应用程序类型,您可能需要查看Eagle这是CLR中Tcl的实现。

我认为你正在碰到.Net希望只从你的应用程序目录或其直接的子目录中加载程序集。这里的应用程序是tclsh / wish可执行文件,这就是移动.Net程序集使其加载的原因。您可以使用合适的清单或调用API来修复此问题,以允许从备用位置加载程序集。在这种情况下,我认为当你的Tcl解释器加载到Tcl解释器中以初始化CLR并添加扩展位置作为从中加载程序集的合适位置时,你需要在Tcl扩展中运行一些初始化代码。我已经有一段时间了,所以我忘记了细节,但我想你想查看AppDomain对象并检查与该对象或其子对象关联的程序集加载路径属性。试试AppDomain.RelativeSearchPath

答案 1 :(得分:0)

更具体地说,Eagle包括Garuda,这是一个Tcl扩展,专门用于从Tcl调用.Net