Хозяйке на заметку - особенности работы с Com объектами Terrasoft'a в C#
Задача: реализовать интеграцию с Террасофт 3.X в консольном приложении (или в Windows service), написанном на C#
Решается достаточно просто при использовании Visual Studio - для созданного проекта консольного приложения выполняете команду Add reference, вкладка COM, выбираете Terrasoft Object Library и импортируете библиотеку типов.
Что необходимо далее? Открыть соединение, что то поделать с объектами конфигурации и закрыть соединение.
{
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]
И все.