Не создается экземпляр "Компаса" через API7 (C#)

Автор daniluk, 01.08.17, 07:40:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

daniluk

01.08.17, 07:40:35 Последнее редактирование: 01.08.17, 08:53:38 от daniluk
Добрый день!

Периодически экземпляр Компас v16.1 отказывается создаваться программно.

Для запуска использую следующий код:


        private static IApplication _kompas7;

        public static IApplication Kompas7
        {
            get
            {
                try
                {
                    if (_kompas7 == null)
                    {
                        _kompas7 = Activator.CreateInstance(KompasType) as IApplication;
                        // Здесь все стопорится. Исключения не возникает, просто бесконечное ожидание.
                    }

                    return _kompas7;
                }

                catch (Exception ex)
                {
                    throw new Exception("Ошибка при запуске Kомпаса", ex);
                }
            }
        }


При этом Компас, при запуске вручную, работает штатно.

Программу запускаю на терминальном сервере, на котором с Компасом параллельно работают 3-10 пользователей. В связи с тем, что сервер терминальный, о перезагрузке не может идти и речи.
Проблема возникает во второй раз, в первый, спустя 2-3 часа, в системе создались (одновременно) ~20 процессов 'Kompas.exe' (от всех попыток запуска программы/отладки). Собственно вопрос: что делать в этом случае?

И, пока есть возможность, задам еще один вопрос. Работа нескольких экземпляров под одним пользователем в этой версии невозможна? При попытке создать второй, первый выбрасывает исключение и завершает работу.

___________________________
ОС: Windows Server 2012 R2
Компас 3D v16.1.0 (x64)
Машиностроение v16.3.0

Дмитрий22

У меня вот такой код работает без проблем
       if (kompas == null)
                    {
                    #if __LIGHT_VERSION__
Type t = Type.GetTypeFromProgID("KOMPASLT.Application.5");
                    #else
                        Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
                    #endif
                        first.label1.Text = "Запускаем Компас в невидимом режиме..";
                        try { kompas = (KompasObject)Activator.CreateInstance(t); kompas.Visible = false; }
                        catch (Exception ee1) { MessageBox.Show(this, "Не могу запустить Компас!", "Сообщение"); }
                    }
                }
                if (kompas != null)
                {
                    Global.Kompas = (KompasObject)kompas;
                    Global.NewKompasAPI = (IApplication)Global.Kompas.ksGetApplication7();
                    kompas.ActivateControllerAPI();
                }
                else   MessageBox.Show(this, "Не найден активный объект", "Сообщение");
               

daniluk

ЦитироватьУ меня вот такой код работает без проблем

Ваш код ничем кардинально не отличается от моего. Да и проблема не в коде. После ребута сервера проблема исчезает.

daniluk2

Может кому пригодится.

Проблема была в зависшем RPC-сервере. При определенных обстоятельствах работа Компаса некорректно завершалась, что и приводило к зависанию. Для того чтобы это исправить, нужно найти "полумертвый" процесс компаса и убить его.

s.tsourkan@gmail.com

10.10.18, 17:36:04 #4 Последнее редактирование: 10.10.18, 17:54:15 от s.tsourkan@gmail.com
Доброго всем времени суток. Есть проблема с созданием экземпляра Компаса через приложение на C#
Код использовался из примера с этого форума:
Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");           
            kompas = (KompasObject)Activator.CreateInstance(t);

            try
            {
                kompas.ActivateControllerAPI();
            }
            catch (Exception ex)
            {
                string mm = ex.Message;
            }
            int type = kompas.ksGetDocumentTypeByName("C:\\А100.frw");
            ksDocument2D doc2D = (ksDocument2D)kompas.Document2D();


Но этот код не работает корректно. Явных ошибок не вылетает, но и не получается получить тип документа type (предпоследняя строка). Всё время выводится 0.
При этом если в watch в отладке посмотреть свойства переменной kompas, там есть поле Message, в котором сообщение об ошибке:

ЦитироватьЭлемент не найден. (Исключение из HRESULT: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))

Windows 10, Kompas V16 x64, VisualStudio 2017. Проект собирался и под x86, и под х64, и под AllPlatforms. Версия .NET 4.5.1

Объясните мне пожалуйста, что я делаю не так?! Компас установлен, запускается корректно, файл C:\A100.frw действительно есть и корректен. Чего ему ещё надо?!
Проблема по большей части в том, что не определяется экземпляр Компаса. По строке Kompas.Application.5 в реестре даже ветка нашлась.

Подскажите пожалуйста, как заставить экземпляр Компаса определяться?
Что характерно, раньше на этой же машине всё работало. После пересборки проекта перестало работать.

Может, с правами доступа что-либо или с COM-компонентами? Я в этом не особо разбираюсь, т. к. это не моя сфера.

DesignЯR

А в процессах потом висят 5 экземпляров Компаса.Не так ли?
try
            {
                kompas.Visible = true;  //   Куда делся?
                kompas.ActivateControllerAPI();
            }
+ Благодарностей: 1

s.tsourkan@gmail.com

До этого момента ещё не дошли.

Kompas.Visible = true; - работает, но открывает пустое окно.

Проблема была, как оказалось, в битом файле *.frw. Как он мог испортиться - непонятно, потому что открывался мною только на чтение.
Поменял его на файл, который точно открывался Компасом и тип документа (ksGetDocumentTypeByName) стал определяться корректно.

Далее была другая проблема - на компьютере коллеги. У неё не запускался Компас программно (SDK было установлено отдельно). Вылечилось добавлением прав на COM-объекты и переустановкой Компаса в режиме полной установки от имени админа.

Благодарю всех за внимание, проблема решилась  :)