ActiveX бибки и .NET

Автор Ethereal, 03.12.02, 16:42:01

« предыдущая - следующая »

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

Ethereal

Кто-нибудь писал ActiveX бибки на .NET?
У меня не получилось.

Ethereal

Отвечаю на свой вопрос сам же. Зарегистрировать ActiveX библиотеку-.NET-сборку через Компас не получится, т.к. он просто сам регистрит COM-объект в регистри с помощью DllRegisterServer, которой, как вы понимаете, в сборке быть не может, и добавляет пустой ключ под названием Kompas_Library - признак того, что COM-объект является ActiveX-библиотекой для Компаса. То есть, надо просто при инсталляции регистрить сборку для COM Interop, и добавить в реализацию COM-объекта пару функций с атрибутами ComRegisterFunctionAttribute и ComUnRegisterFunctionAttribute, которые соответственно будут добавлять и удалять из ключа регистрации COM-объекта в HKEY_CLASSES_ROOT вышеупомянутый подключ. А получается, кстати, даже удобнее - юзеру не надо искать на диске эту сборку, да и удалить из списка он ее случайно не сможет. )

янс

А нельзя ли поподробнее примерчик для C# 2005? Заранее спасибо.

udachnik

Вроде делал так:
1 Создал новый проект Windows Control Library
2 В солюшн эксплоэре Add Reference: KompasApi7 или ту версию какую пользуюте
3 Для удобства там же в солюшн эксплоэре добавил новый класс куда и поместил нужный
код. (Контекстном меню на имени проекта -> add -> new item -> class)
4 в начале файла добавил using KompasAPI7;
5 Наполняем класс функциями
в результате должны получить билиотеку с двумя командыми  - выдают сообщения 1 и 2

// Название Библиотеки
        [return: MarshalAs(UnmanagedType.BStr)]
        public string GetLibraryName()
        {
            return "Моя библиотека";
        }

// Головная функция библиотеки
public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_)
   {       
      IKompasAPIObject MyKompasObj; 
       //получим обьект компас
      try
       {
          MyKompasObj = Marshal.GetActiveObject("KOMPAS.Application.7") as IKompasAPIObject;                   
        }
        catch
        {               
           System.Windows.Forms.MessageBox.Show("Не удалось подключиться к Компас");
           return;
        }
      // согласно номера команды do something
      switch (command)
        {           
                case 1:
                       System.Windows.Forms.MessageBox.Show("1"); break;                   
                case 2:
                        System.Windows.Forms.MessageBox.Show("2"); break;                 
         }
                             
   }

// меню формируем
      [return: MarshalAs(UnmanagedType.BStr)]
        public string ExternalMenuItem(short number, ref short itemType, ref short command)
        {
            string result = string.Empty;
            itemType = 1; // "MENUITEM"
            switch (number)
            {
                case 1:
                    result = "2";
                    command = 1;
                    break;
                case 2:
                    result = "1";
                    command = 2;
                    break;
                case 3:
                    command = -1;
                    itemType = 3; // "ENDMENU"
                    break;
            }
            return result;
        }
        // регистрация библиотеки
        #region COM Registration
        // Эта функция выполняется при регистрации класса для COM
        // Она добавляет в ветку реестра компонента раздел Kompas_Library,
        // который сигнализирует о том, что класс является приложением Компас,
        // а также заменяет имя InprocServer32 на полное, с указанием пути.
        // Все это делается для того, чтобы иметь возможность подключить
        // библиотеку на вкладке ActiveX.
        [ComRegisterFunction]
        public static void RegisterKompasLib(Type t)
        {
            try
            {
                RegistryKey regKey = Registry.LocalMachine;
                string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
                regKey = regKey.OpenSubKey(keyName, true);
                regKey.CreateSubKey("Kompas_Library");
                regKey = regKey.OpenSubKey("InprocServer32", true);
                regKey.SetValue(null, System.Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\mscoree.dll");
                regKey.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("При регистрации класса для COM-Interop произошла ошибка:\n{0}", ex));
            }
        }

        // Эта функция удаляет раздел Kompas_Library из реестра
        [ComUnregisterFunction]
        public static void UnregisterKompasLib(Type t)
        {
            RegistryKey regKey = Registry.LocalMachine;
            string keyName = @"SOFTWARE\Classes\CLSID\{" + t.GUID.ToString() + "}";
            RegistryKey subKey = regKey.OpenSubKey(keyName, true);
            subKey.DeleteSubKey("Kompas_Library");
            subKey.Close();
        }
        #endregion

udachnik

... продолжение....

в свойствах проекта на закладке Build поставить галку

Register for Com interop

В компасе делаем добавить описание прикладной библиотеки, там на закладке ActiveX Должна быть
наша библиотека

Fomenko75

Помогите разобраться с  Active X , под  пользователем не  отображается библиотека
на  закладке  Active X  под администратором все нормально

KonstrSerg

где то здесь был пример по написанию бибки на vs 2008 без регистрации в реестре. НЗапуск производился на C++ ф дальше на VB.net

Fomenko75

Может  кто программирует Вертикаль в C#?   
Очень нужна  помощь по созданию объекта Вертикали.

Fomenko75

Кто -нибудь  программирует Вертикаль  в  C#  ?

Очень нужна помощь  по созданию  объекта Вертикали.

udachnik

Сам себя поправлю. Вот так:
Цитата: udachnik от 04.06.08, 11:37:10
IKompasAPIObject MyKompasObj; 
//получим обьект компас
MyKompasObj = Marshal.GetActiveObject("KOMPAS.Application.7") as IKompasAPIObject;       

желательно наверно и не страдать, ведь объект компас передаётся в головную функцию библиотеки. 
Цитата: udachnik от 04.06.08, 11:37:10
public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_ )

Достаточно воспользоваться пирведением типов:
(Kompas6API5.KompasObject) kompas_   

      

Дмитрий22

Цитата: Fomenko75 от 20.04.10, 09:04:40
Помогите разобраться с  Active X , под  пользователем не  отображается библиотека
на  закладке  Active X  под администратором все нормально


Собственно, вопрос в этом. В Компасе 12, 13 библиотеки появляются на вкладке Active X, а в более высоких версиях Компаса нужно запускать Компас под администраторм. Что сделать, чтоб не нужно?

Дмитрий22

Исправлено!!!!!!!!!


Информируем Вас, что описанная в данном запросе проблема решена в коммерческой версии КОМПАС-3D V15 SP2.
Подробное описание исправляемых экспресс-обновлением проблем и особенности его применения приведены в файле описания Base_15_2_14.pdf
Для устранения проблемы необходимо установить экспресс-обновление 15.2.14, скачать которое Вы можете в Личном кабинете СТП - http://sd.ascon.ru/otrs/customer.pl?Action=CustomerK3DUpdateCenter