Re[3]: компонента для 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.05 11:22
Оценка:
Здравствуйте, Serginio1, Вы писали:

ublic void RegisterExtensionAs(
  [MarshalAs(UnmanagedType.BStr)]
  ref String extensionName)
{
  try 
  {
    // initialize data members
    nameToNumber      = new Hashtable();
    numberToName      = new Hashtable();
    numberToParams    = new Hashtable();
    numberToRetVal    = new Hashtable();

    propertyNameToNumber  = new Hashtable();
    propertyNumberToName  = new Hashtable();

    numberToMethodInfoIdx  = new Hashtable();
    propertyNumberToPropertyInfoIdx  = new Hashtable();

    // Заполнение хэш-таблиц
    Type type = this.GetType();
    Type[] allInterfaceTypes = type.GetInterfaces();

    // Определение идентификатора
    int Identifier = 0;

    foreach(Type interfaceType in allInterfaceTypes)
    {
      if (
        !interfaceType.Name.Equals("IDisposable") 
        && !interfaceType.Name.Equals("IManagedObject")
        && !interfaceType.Name.Equals("IRemoteDispatch")
        && !interfaceType.Name.Equals("IServicedComponentInfo")
        && !interfaceType.Name.Equals("IInitDone")
        && !interfaceType.Name.Equals("ILanguageExtender")
        )
      {
        // Обработка методов
        MethodInfo[] interfaceMethods = interfaceType.GetMethods();
        foreach (MethodInfo interfaceMethodInfo in interfaceMethods)
        {
          nameToNumber.Add(interfaceMethodInfo.Name, Identifier);
          numberToParams.Add(Identifier,
            interfaceMethodInfo.GetParameters().Length);
          if (typeof(void) != interfaceMethodInfo.ReturnType)
            numberToRetVal.Add(Identifier, true);

            Identifier++;
          }

        // Обработка свойств
        PropertyInfo[] interfaceProperties = interfaceType.GetProperties();
        foreach (PropertyInfo interfacePropertyInfo in interfaceProperties)
        {
          propertyNameToNumber.Add(interfacePropertyInfo.Name, Identifier);

          Identifier++;
        }
      }
    }

    foreach (DictionaryEntry entry in nameToNumber)
      numberToName.Add(entry.Value, entry.Key);
    foreach (DictionaryEntry entry in propertyNameToNumber)
      propertyNumberToName.Add(entry.Value, entry.Key);

    // Сохранение информации о методах класса 
    allMethodInfo = type.GetMethods();

    // Сохранение информации о свойствах класса
    allPropertyInfo = type.GetProperties();

    // Отображение номера метода на индекс в массиве
    foreach (DictionaryEntry entry in numberToName)
    {
      bool found = false;
      for(int ii = 0; ii < allMethodInfo.Length; ii++)
      {
        if (allMethodInfo[ii].Name.Equals(entry.Value.ToString()))
        {
          numberToMethodInfoIdx.Add(entry.Key, ii);
          found = true;
        }
      }
      if (false == found)
        throw new COMException("Метод не реализован ");
    }

    // Отображение номера свойства на индекс в массиве
    foreach (DictionaryEntry entry in propertyNumberToName)
    {
      bool found = false;
      for(int ii = 0; ii < allPropertyInfo.Length; ii++)
      {
        if (allPropertyInfo[ii].Name.Equals(entry.Value.ToString()))
        {
          propertyNumberToPropertyInfoIdx.Add(entry.Key, ii);
          found = true;
        }
      }
      if (false == found)
        throw new COMException("The property is not implemented");
    }

    // Компонент инициализирован успешно
    // Возвращаем имя компонента
    extensionName  = componentName;
  }
  catch (Exception)
  {
    return;
  }
}



Основное обратить внимание на
Type type = this.GetType();
Type[] allInterfaceTypes = type.GetInterfaces();

То есть вы должны определить свои интерфейсы и определить методы в классе наследнике от Сомпонент.
Можно переопределить данный метот, путем внедрение своего класса без интефейсов, слегка переписав медод формирования Хэш таблицы методов и свойств.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.