Пример #1
0
    /// <summary>
    /// Создаем класс реализущий работу подкоманды.
    /// </summary>
    /// <param name="result">класс реализущий работу подкоманды.</param>
    /// <returns>true - класс реализущий работу подкоманды создан.</returns>
    public bool CreateInstance(out ICommandLineRun result)
    {
        bool rc = false;

        result = null;
        try
        {
            string classNameCmd = string.Empty;
            if (string.IsNullOrEmpty(this.NameClassRun))
            {//строим имя исполняющего команду класса вместе с именем пространства и суффикс
                // суффикс = constSufficsClass = "CommandLine"
                // Для команды с имененем нelp - класс нelpCommandLine:
                // Для команды с имененем parse - класс parseCommandLine:
                // именя пространства NameClassRun и CommandLineSample совпадают
                classNameCmd += this.GetType().Namespace + '.'
                                + this.CommandName + constSufficsClass;
            }
            else //
            {
                classNameCmd = this.NameClassRun;
            }

            Type typeclass = Type.GetType(classNameCmd);
            // Определяем, может ли экземпляр указанного типа быть назначен
            // переменной типа ICommandLineRun
            if (typeclass != null &&
                typeof(ICommandLineRun).IsAssignableFrom(typeclass))
            {                                                    //      - typeclass является производным от ICommandLineRun.
                // разрешим и загрузим библиотеку
                if (!string.IsNullOrEmpty(AssemblyNameWithPath)) // есть библиотека для загрузки
                {
                    this.pluginAssembly = CommandLineService.LoadPlugin(this.AssemblyNameWithPath);
                }
                // создадим экземпляр:
                result             = (ICommandLineRun)Activator.CreateInstance(typeclass);
                this.commandClass  = result;
                result.CommandName = this.CommandName; // имена совпадают.НУ пока так.
                rc = true;
            }
        }
        catch (System.ArgumentException exc1)
        { //     Параметр type не является объектом типа RuntimeType. -или- Значение параметра
          //     type является открытым универсальным типом (иными словами, свойство
        }
        catch (System.NotSupportedException exc2)
        {//     Тип, заданный параметром type, не может быть System.Reflection.Emit.TypeBuilder.
         //     -или- Создание типов System.TypedReference, System.ArgIterator, System.Void
         //     и System.RuntimeArgumentHandle или массивов этих типов не поддерживается.
         //     -или- Сборка, содержащая тип type, является динамической сборкой, созданной
         //     с помощью System.Reflection.Emit.AssemblyBuilderAccess.Save.
        }
        catch (System.Reflection.TargetInvocationException exc3)
        { //     Вызываемый конструктор создает исключение.
        }
        catch (System.MethodAccessException exc4)
        {//     Вызывающий код не имеет разрешения на вызов этого конструктора.
        }
        catch (System.MemberAccessException exc5)
        { //     Не удается создать экземпляр абстрактного класса, или этот член был вызван
          //     при помощи механизма поздней привязки.
        }
        catch (System.Runtime.InteropServices.InvalidComObjectException exc6)
        { //     COM-тип не был получен посредством Overload:System.Type.GetTypeFromCLSID
          //     или Overload:System.Type.GetTypeFromProgID.
        }
        catch (System.Runtime.InteropServices.COMException exc8)
        { //     Параметр type представляет COM-объект, но идентификатор класса, используемый
          //     для получения типа, является недопустимым, или идентифицируемый класс не
          //     зарегистрирован.
        }
        return(rc);
    }