我需要创建一个调用托管.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], ¶m) != 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上部署,并且最好不要将我的应用程序文件与其他应用程序混合。
似乎应该有一些配置设置可以解决这个问题,但我不知道在哪里。非常感谢任何帮助。
答案 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