Тема: Скрипты TCS + .NET

Добрый день!!!

Пришла в голову мысль через скрипт TCS вызвать метод из внешней dll. (по примеру встроенного скрипта "Движение детали").

Написали. Работает. Порадовались.

Однако, вот беда, при закрытии технолоджикс начинает ругаться нецензурными словами: ошибка во вложении

Может программисты посоветуют что-нибудь?

С уважением, Рыбаков Владислав Евгеньевич.
Начальник отдела разработки программных средств
Дирекция по ИТ
ОАО "Уралмашзавод"
тел. +79126038529
ICQ: 320237204

Post's attachments

Error.doc 26.5 Кб, 5 скачиваний с 2009-04-23 

You don't have the permssions to download the attachments of this post.

Re: Скрипты TCS + .NET

Здравствуйте!

Версию программы пожалуйста, и скажите что именно используете и как? небольшой примерчик может был бы кстати, хотя может и без него разберемся.

(изменено: _AB_, 23 апреля 2009 19:07:41)

Re: Скрипты TCS + .NET

Доброго времени суток!
У нас была подобная проблема при разработке dll для TCS на VB.NET.
Помогло зануление (<Объект> = Nothing) создаваемых объектов :rolleyes:

Кстати, было бы неплохо, если разработчики поделились какими-либо примерами разработки библиотек под .NET, потому как на форуме я находил примеры только для VB6 и Delphi. :)

Re: Скрипты TCS + .NET

Учтем, добавим примеры для VB.Net

Зануление в Net действительно м.б. необходимо, так как там объекты удаляются сборщиком мусора, то есть не предсказуемо. А в данном случае это может быть и важно.

(изменено: Vlad Rybakov, 24 апреля 2009 05:50:42)

Re: Скрипты TCS + .NET

Естественно объект гасим. Не спасает.
Пример скрипта:

  nmknote=TCSActiveModule.Properties("PrBOMStructureItem_Note").Value
  Set ob1 = CreateObject("ZayavkaPlan41.Zayavka")
  ob1.FormPlavka (nmknote)
  Set ob1 = Nothing
  TCSActiveModule.Refresh

ZayavkaPlan41 - это наша dll

Версия 5.0.2.0(9328)

Re: Скрипты TCS + .NET

Я так понимаю имелось ввиду в Vb.Net

В самом VB Script это обычно не нужно, он сильно попроще.

Re: Скрипты TCS + .NET

Да, Олег. Почти.

На С# написана библиотечка...

Re: Скрипты TCS + .NET

Да там особой разницы нет Vb, C#. Ну попробую накидать простой примерчик на C# и Vb.Net. Может повторится ошибочка.

Re: Скрипты TCS + .NET

Накидайте. Если что, в принципе, могу свою Dll заслать. Единственное, функционал работать не будет...

Но ошибка возникала даже если просто вызвать макрос и закрыть форму...

Re: Скрипты TCS + .NET

Есть ли успехи?

Re: Скрипты TCS + .NET

Текущие дела раскидаем, займемся. Заготовок простых просто нет под рукой.

Re: Скрипты TCS + .NET

Ну как бы проблем особых не нашел, работает замечательно пример. Может у вас что посложнее, а может инициализируете просто иначе. Погоняю еще на 5.0.2 версии, может там нюансы есть какие, но не думаю.

Код на C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Ex1
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class Ex1Class
    {
        public void ShowModule(object TCSApp, object TCSActiveModule)
        {
            try
            {
                CSDN.ITcs_Application app = (CSDN.ITcs_Application)TCSApp;
                CSDN.IGModule module = (CSDN.IGModule)TCSActiveModule;
                app.NmkClasses.get_ShowModal("Select class");
                module.get_ShowModal("Hello from active module!");
                for (int i = 0; i < module.ChildModules.ModulesCount; ++i)
                {
                    CSDN.IPModule m = module.ChildModules.get_ModuleItems(i).AsIDispatch as CSDN.IPModule;
                    if (m != null) m.get_ShowModal("This is child module:" + module.ChildModules.get_ModuleItems(i).Caption); 
                }     
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show( e.ToString() );
            }
        }
    }
}

Компилим, регистрируем COM объект.

Пишем вот такой макрос (например в номенклатурном справочнике )

Sub FormMacro_temp123(TCSActiveModule)
 tag = TCSActiveModule.Tag 'Sorry, we should initialize our internal interfaces here
 Set oo = CreateObject( "Ex1.Ex1Class" )
 Call oo.ShowModule( TCSApp, TCSActiveModule ) 
End Sub

Запускаем, Смотрим как работает, выходим из программы - никаких ошибок не наблюдаю.

(изменено: Vlad Rybakov, 4 мая 2009 10:49:33)

Re: Скрипты TCS + .NET

Хорошо, попробуем Ваш пример.
Какая версия Framework?

Re: Скрипты TCS + .NET

Это 2-ой. На первом не проверял, хотя вроде ничего  особенного я там не зацепил.

Re: Скрипты TCS + .NET

Доброго всем времени суток!
Почти победил данную проблему. Ошибка появлялась тогда, когда метод
ob1.Formzayavka (part_id) при открытии формы передавал параметр прямо в конструктор формы. Если не передавать таким образом параметры, а добавить соотв свойства базовому классу и использовать их, то все ОК.

Не могу пока победить только одну форму - она от работающей отличается наличием BindingSource и BindingNavigator. Есть подозрение, что они не убиваются корректно.

Re: Скрипты TCS + .NET

Добрый день!

tag = TCSActiveModule.Tag 'Sorry, we should initialize our internal interfaces here
Set ComObj = CreateObject( "Namespace.ClassName" )

Call ComObj.Show(TCSApp, TCSActiveModule)

If Not ComObj Is Nothing Then
Set ComObj = Nothing
End if

Зарегистрировал .dll. В TCS запускается вышеуказанный код. При попытке сбилдить .dll получаю ошибку: "Процесс не может получить доступ к файлу так как этот файл занят другим процессом". Приходится перезапускать TCS. Можно ли как-то это обойти?

Re: Скрипты TCS + .NET

q41HCxSH0bAz1Reugyc0 пишет:

Приходится перезапускать TCS. Можно ли как-то это обойти?

К сожалению, никак. Выгрузить dll из памяти можно только с выгрузкой TechnologiCS/

Спасибо сказали: q41HCxSH0bAz1Reugyc01