Публикация

Хозяйке на заметку - особенности работы с Com объектами Terrasoft'a в C#

Задача: реализовать интеграцию с Террасофт 3.X в консольном приложении (или в Windows service), написанном на C#
Решается достаточно просто при использовании Visual Studio - для созданного проекта консольного приложения выполняете команду Add reference, вкладка COM, выбираете Terrasoft Object Library и импортируете библиотеку типов.
Что необходимо далее? Открыть соединение, что то поделать с объектами конфигурации и закрыть соединение.

        static void Main(string[] args)
        {
            String ConfigName = "Developing";
            String TSLogin = "";
            String TSPassword = "";
            AuthenticationModeEnum AuthenticationMode;
            AuthenticationMode = AuthenticationModeEnum.amWindows;
            TSObjectLibrary.Connector TSConnector = new ConnectorClass();
            Boolean LoggedIn = TSConnector.OpenConfigurationByName(ConfigName, AuthenticationMode, TSLogin, TSPassword);
            string LoggingResult = "LoggedIn = " + LoggedIn.ToString();
            Console.WriteLine(LoggingResult); // проверка успешного подключения

            /*..здесь через TSConnector что-то делаем с сервисами для поставленной задачи..*/

            TSConnector.CloseConfiguration(); // Закрываем соединение
}

Простой код, все работает - до тех пор, пока ваше консольное приложение не завершает работу. У вас валятся ошибки аля "Неизвестное программное исключение" и "Runtime error"

Причина: по умолчанию услужливая Visual Studio задает параметры проекта так, что поток, в котором мы создали экземпляр TSObjectLibrary.Connector, работает в режиме MTA (Multi Threaded Apartment), в то время, как сам коннектор создан только для работы в STA

Решение простое: перед строкой static void Main(string[] args) добавить атрибут [STAThread]
И все.

Нравится

Поделиться

1 комментарий

Спасибо!!! Очень полезный материал.

Показать все комментарии