【问题标题】:Tcl Extension Calling a VB.NET DLL调用 VB.NET DLL 的 Tcl 扩展
【发布时间】: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], &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 上进行部署,并且最好不要将我的应用程序的文件与另一个应用程序的文件混合在一起。

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

【问题讨论】:

    标签: c++ vb.net clr tcl


    【解决方案1】:

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

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

    【讨论】:

    • 您是否有更多关于如何使用 AppDomain.RelativeSearchPath 指定目录的详细信息?
    【解决方案2】:

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

    【讨论】:

    • 据我所知,Eagle 不包括 Tk。不幸的是,这对这个特定的项目来说是一个交易破坏者。
    • @jags0333 Eagle 不是 Garuda,而且 Garuda 也不包含在 Eagle 中。它们非常不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多