Ошибка регистрации сборки WinSCP .NET в Dolphin Smalltalk

Я пытаюсь использовать стороннюю DLL (сборку WinSCP .NET) в Dolphin 6.1b2. Я зарегистрировал DLL и создал TypeLib в Windows 7.

В Dolphin я успешно использовал мастер компонентов для создания интерфейсов, но когда я пытаюсь зарегистрировать элемент управления и TypeLib, я получаю ошибки. При регистрации управления я получаю

WinSCPnet.dll был загружен, но не удалось найти точку входа DllRegisterServer.

Кто-нибудь знает, почему это терпит неудачу? Я также спросил автора DLL, и он склоняется к проблеме Dolphin, поскольку регистрация работала в Windows.


person Duetto    schedule 14.07.2016    source источник


Ответы (1)


DLL представляет собой сборку .NET, импортируйте сгенерированный TLB.

Загружен .NET пакет сборки/автоматизации" с: https://winscp.net/eng/download.php

Распакован, зарегистрирован согласно включенному readme_automation.txt.
См. также Загрузка и установка сборки WinSCP .NET

Запустил новый Dolphin, импортировал .tlb, сгенерированный с префиксом WinSCP (чтобы классы не начинались с _).

Открытое рабочее пространство, импортированный пул WinSCP_Constants, преобразованный запуск примера C# (https://winscp.net/eng/docs/library#example):

opts := WinSCP_SessionOptions new
            protocol: Protocol_Sftp;
            hostName = 'example.com';
            userName: 'user';
            password: 'mypassword';
            sshHostKeyFingerprint: 'ssh-rsa 2048 ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff';
            yourself.

Вернул рабочий объект...

РЕДАКТИРОВАТЬ: Ваше мнение на форумах WinSCP "чтобы использовать его в дельфине, вам нужно, чтобы его инструменты зарегистрировали dll и tlib" неверно. «Источник» COM необходимо зарегистрировать только один раз (в случае «старомодного» COM-сервера вы можете использовать либо regsvr32, либо dolphin — оба делают то же самое; в случае сборки .NET вы должны использовать заклинание .NET ). Единственное, что действительно необходимо на стороне дельфина, — это импортировать ранее зарегистрированную библиотеку.

Если есть .TLB, я бы выбрал .TLB, иначе попытаю счастья с .DLL. К сожалению, для некоторых стандартных COM-интерфейсов Microsoft никогда не делала библиотеки типов доступными, так что там все еще хуже (используйте C/C++ или создавайте таблицы структур/интерфейсов вручную).

Редактировать 2 - дополнительные вопросы:

1) можете ли вы объяснить связь между typelib и библиотечным классом, который «я создаю» (т.е. учебник по дельфинам в справке)

Dolphin создает классы smalltalk для отражения типов/структур COM. Вы используете их для создания экземпляров COM-типов из Smalltalk, вызываете их методы, передаете их (а также примитивные типы, такие как строки, целые числа, ...) в качестве аргументов и получаете типы Smalltalk для возвращаемых значений (Dolphin выполняет все преобразования за вас, поэтому вы можете +- забыть, что вы звоните по иностранному коду).

2) пример реализованного вами метода сопоставления библиотечного класса с интерфейсом winscp.

Я ничего не реализовал, я просто использовал сгенерированную оболочку (в фоновом режиме COM-объект WinSCP - SessionOptions - был создан и имел некоторые свойства).

в общем, я просто сказал:

var opts = new WinSCP.SessionOptions().
opts.Protocol = Protocol.Sftp;
opts.HostName = .........

Просто просмотрите документацию/примеры автоматизации WinSCP, а затем преобразуйте их в малый разговор (и, надеюсь, это должно работать автоматически ;-).

3) где определены методы smalltalk: protocol:, hostName: и т. д.? Я искал изображение, и их там нет. как вы узнали, что нужно использовать эти имена методов?

Поскольку SessionOptions (представленный классом [PREFIX]_SessionOptions в Dolphin) является интерфейсом IDispatch (подклассом IDispatch в Dolphin), все вызовы методов являются динамическими по своей природе. Вы просто делаете правильные вещи (и отлавливаете возможные сбои с необходимой степенью детализации), и это будет «просто работать (тм)».

Родственный язык Smalltalk — это метод #doesNotUnderstand: aMessage.

person Miloslav Raus    schedule 14.07.2016
comment
PS: Я не собираюсь подписываться на форумы WinSCP, где вы также спрашивали, если это так, разместите это там ... - person Miloslav Raus; 14.07.2016
comment
Мирослав, я следовал вашим инструкциям и примеру и вернул действительный экземпляр. Спасибо! - person Duetto; 14.07.2016
comment
miroslav, 1) можете ли вы объяснить связь между typelib и классом библиотеки, который я создаю (т.е. учебник по дельфинам в справке) 2) пример реализованного вами метода сопоставления класса библиотеки с интерфейсом winscp. - person Duetto; 14.07.2016