Расширение Tcl Вызов DLL-библиотеки VB.NET - PullRequest
1 голос
/ 08 февраля 2012

Мне нужно создать расширение Tcl, которое вызывает управляемую .NET DLL / библиотеку классов. В настоящее время структура моего приложения: 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

My Tcl Extension (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 расширения, то происходит сбой расширения, когда он создает объект TestClass. Я заметил, что если библиотека VB.NET перемещена в C: \ Tcl \ bin, расширение найдет ее , и TestCmd можно будет назвать просто отлично. Проблема заключается в том, что это в конечном итоге потребуется для развертывания на нескольких компьютерах, и желательно не смешивать файлы моего приложения с файлами другого приложения.

Кажется, должны быть какие-то настройки конфигурации, которые решат эту проблему, но я не уверен, где. Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Во-первых, в зависимости от того, какое приложение Tcl вы используете, вы можете посмотреть на Eagle , который представляет собой реализацию Tcl в CLR.

Я думаю, что вы натолкнулись на желание .Net загружать сборки только из каталога вашего приложения или его непосредственных подкаталогов. В данном случае это исполняемый файл tclsh / wish, поэтому при перемещении сборки .Net он загружается. Это то, что вы можете исправить с помощью подходящих манифестов или обращений к API, чтобы разрешить загрузку сборки из других мест. В этом случае я думаю, что вам нужно будет запустить некоторый код инициализации в вашем расширении Tcl, когда он будет загружен в интерпретатор Tcl, чтобы инициализировать CLR и добавить расположение расширений как подходящее место для загрузки сборок. Прошло много времени с тех пор, как я смотрел на это, поэтому я забыл детали, но я думаю, что вы хотите посмотреть на объект AppDomain и проверить свойства пути загрузки сборки, связанные с этим или его дочерними объектами. Попробуйте AppDomain.RelativeSearchPath

0 голосов
/ 11 февраля 2012

Чтобы быть более точным, Eagle включает Garuda, который является расширением Tcl, созданным специально для вызова .Net из Tcl

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...