【发布时间】:2012-02-08 15:16:25
【问题描述】:
我需要创建一个调用托管 .NET DLL/类库的 Tcl 扩展。目前,我的应用程序的结构是Tcl > DLL Wrapper (C++ CLR) > .NET Class Library (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 上进行部署,并且最好不要将我的应用程序的文件与另一个应用程序的文件混合在一起。
似乎应该有一些配置设置可以解决这个问题,但我不确定在哪里。非常感谢任何帮助。
【问题讨论】: