C #, Type.GetType () не возвращает имя класса из строки во всех случаях - PullRequest
2 голосов
/ 16 сентября 2011

Мой код такой

public static object getClassInstance(string key, params  object[] constructorArgs)
        {
            string assemblyPath = null;
            string customClassName = null;
            DataSet objDataset = getAssemblyInfo(key);
            if (objDataset != null && objDataset.Tables.Count > 0 && objDataset.Tables[0].Rows.Count > 0)
            {
                assemblyPath = objDataset.Tables[0].Rows[0]["ACA_ASSEMBLY_PATH"].ToString();
                customClassName = objDataset.Tables[0].Rows[0]["ACA_CLASS_NAME"].ToString();
            }

            Assembly assembly;
            Type type;

            if (assemblyPath != null && assemblyPath != string.Empty)
            {
                assembly = Assembly.LoadFile(assemblyPath);
                type = assembly.GetType(customClassName);
            }
            else // if no customisation
            {
                type = Type.GetType(key);
            }

            object classInstance = constructorArgs == null ? Activator.CreateInstance(type) : Activator.CreateInstance(type, constructorArgs);
            if (classInstance == null) throw new Exception("broke");
            return classInstance;

        }

В приведенном выше коде я передаю ключ в качестве пространства имен. // если в течение нескольких дней ни один раздел кода не работал идеально. затем внезапно это начало действовать измученным. в некоторых случаях он возвращает мне имя класса из строки, а в некоторых - не возвращает (возвращает ноль). Все имена классов, которые будут сгенерированы из ключа, имеют доступ из этого метода. Там нет проблемы доступности как таковой.

Я видел документацию http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx. В разделе замечаний он говорит

GetType работает только на сборках, загруженных с диска. Если вы вызываете GetType для поиска типа, определенного в динамической сборке, определенной с помощью сервисов System.Reflection.Emit, вы можете получить противоречивое поведение. Поведение зависит от того, является ли динамическая сборка постоянной, то есть созданной с использованием режимов доступа RunAndSave или Save для перечисления System.Reflection.Emit.AssemblyBuilderAccess. Если динамическая сборка является постоянной и была записана на диск до вызова GetType, загрузчик находит сохраненную сборку на диске, загружает эту сборку и извлекает тип из этой сборки. Если сборка не была сохранена на диск при вызове GetType, метод ничего не возвращает. GetType не понимает переходные динамические сборки; следовательно, вызов GetType для извлечения типа во временной динамической сборке ничего не возвращает.

Это что-то вызывает у меня проблему? , Может ли кто-нибудь помочь.

...