Кто-нибудь писал ActiveX бибки на .NET?
У меня не получилось.
Отвечаю на свой вопрос сам же. Зарегистрировать ActiveX библиотеку-.NET-сборку через Компас не получится, т.к. он просто сам регистрит COM-объект в регистри с помощью DllRegisterServer, которой, как вы понимаете, в сборке быть не может, и добавляет пустой ключ под названием Kompas_Library - признак того, что COM-объект является ActiveX-библиотекой для Компаса. То есть, надо просто при инсталляции регистрить сборку для COM Interop, и добавить в реализацию COM-объекта пару функций с атрибутами ComRegisterFunctionAttribute и ComUnRegisterFunctionAttribute, которые соответственно будут добавлять и удалять из ключа регистрации COM-объекта в HKEY_CLASSES_ROOT вышеупомянутый подключ. А получается, кстати, даже удобнее - юзеру не надо искать на диске эту сборку, да и удалить из списка он ее случайно не сможет. )
А нельзя ли поподробнее примерчик для C# 2005? Заранее спасибо.
Вроде делал так:
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
... продолжение....
в свойствах проекта на закладке Build поставить галку
Register for Com interop
В компасе делаем добавить описание прикладной библиотеки, там на закладке ActiveX Должна быть
наша библиотека
Помогите разобраться с Active X , под пользователем не отображается библиотека
на закладке Active X под администратором все нормально
где то здесь был пример по написанию бибки на vs 2008 без регистрации в реестре. НЗапуск производился на C++ ф дальше на VB.net
Может кто программирует Вертикаль в C#?
Очень нужна помощь по созданию объекта Вертикали.
Кто -нибудь программирует Вертикаль в C# ?
Очень нужна помощь по созданию объекта Вертикали.
Сам себя поправлю. Вот так:
Цитата: udachnik от 04.06.08, 12:37:10
IKompasAPIObject MyKompasObj;
//получим обьект компас
MyKompasObj = Marshal.GetActiveObject("KOMPAS.Application.7") as IKompasAPIObject;
желательно наверно и не страдать, ведь объект компас передаётся в головную функцию библиотеки.
Цитата: udachnik от 04.06.08, 12:37:10
public void ExternalRunCommand([In] short command, [In] short mode, [In, MarshalAs(UnmanagedType.IDispatch)] object kompas_ )
Достаточно воспользоваться пирведением типов:
(Kompas6API5.KompasObject) kompas_
Цитата: Fomenko75 от 20.04.10, 10:04:40
Помогите разобраться с Active X , под пользователем не отображается библиотека
на закладке Active X под администратором все нормально
Собственно, вопрос в этом. В Компасе 12, 13 библиотеки появляются на вкладке Active X, а в более высоких версиях Компаса нужно запускать Компас под администраторм. Что сделать, чтоб не нужно?
Исправлено!!!!!!!!!
Информируем Вас, что описанная в данном запросе проблема решена в коммерческой версии КОМПАС-3D V15 SP2.
Подробное описание исправляемых экспресс-обновлением проблем и особенности его применения приведены в файле описания Base_15_2_14.pdf
Для устранения проблемы необходимо установить экспресс-обновление 15.2.14, скачать которое Вы можете в Личном кабинете СТП - http://sd.ascon.ru/otrs/customer.pl?Action=CustomerK3DUpdateCenter