Подтвердить что ты не робот

С# лить производный класс для исключения базового класса через отражение

У меня есть приложение, которое динамически создает классы с использованием отражения. При развертывании я получаю исключение при передаче производного класса в его базовый класс. Это происходит только на 1 из 100 машин. Все классы находятся в одной и той же сборке. Ниже приведены фрагменты кода и вывод из сообщения о регистрации непосредственно перед исключением исключения. Я нахожусь в своем уме, любая помощь очень ценится.

//Parent class
namespace Framework.DataModel
{
    [Serializable]
    public class DataTreeRequest : TreeNode, IDirtyListener, ISerializable
    {
        ....
    }
}

// Derived Class    
namespace Framework.DataModel
{
    [Serializable]
    public class CADElementRequest : DataTreeRequest
    {
        public CADElementRequest(String name) : base(name){}
    }
}


// Method that uses reflection to create class and then cast to its base class
namespace Framework.DataModel
{
    [Serializable]
    public class DataModelBuilder : CoreBuilder
    {
        ...

        protected DataTreeRequest CreateDataTreeRequest(String asmName, String inName, String inType, String inSourceName)
        {
            DataTreeRequest dtr = null;

            Assembly asm = Assembly.LoadFrom(asmName);
            if (asm == null)
            {
                throw new BaseException("Can't find assembly " + asmName);
            }

            Type requestType = asm.GetType(inType);
            if (requestType == null)
            {
                throw new BaseException("Can't find class of type " + inType + " in assembly " + asmName);
            }

            // Call the constructor for the tree node that takes the xml node as an argument
            Type[] constructorArgsTypes = new Type[1];
            constructorArgsTypes[0] = typeof(String);
            ConstructorInfo constructorInfo = requestType.GetConstructor(constructorArgsTypes);
            if (constructorInfo == null)
            {
                throw new BaseException("Can't find constructor for type " + inType + " that takes a String param");
            }

            Object[] constructorArgs = new Object[1];
            constructorArgs[0] = inName;
            Object newObj = constructorInfo.Invoke(constructorArgs);

            // Code fails on this line trying to cast derived class to base class on 1 in 100 machines
            dtr = newObj as DataTreeRequest;
            if (dtr == null)
            {
                throw new BaseException("Can't cast newObj to type DataTreeRequest. newObj = " + newObj + ", Type = " + newObj.GetType().ToString());
            }

            dtr.InSource = inSourceName;

            return dtr;
        }
    }
}

Выход журнала на неудавшейся машине:

Message = Found assembly = Framework.DataModel, Version = 1.0.5885.31486, Культура = нейтральная, PublicKeyToken = null

Сообщение = newObj AssemblyQualifiedName = Framework.DataModel.CADElementRequest, Framework.DataModel, Version = 1.0.5885.31486, Культура = нейтральная, PublicKeyToken = null, BaseType == Framework.DataModel.DataTreeRequest, ПолноеИмя == Framework.DataModel.CADElementRequest

BaseException: нельзя использовать newObj для ввода DataTreeRequest. newObj = Name = Подстанция; InType =; InName = Подстанция; OutName = Подстанция; InSource =; = Outsource;, Тип = Framework.DataModel.CADElementRequest

4b9b3361

Ответ 1

попробуйте заменить

Assembly asm = Assembly.LoadFrom(asmName);
if (asm == null)
{
    throw new BaseException("Can't find assembly " + asmName);
}

Type requestType = asm.GetType(inType);

с

Type requestType = Type.GetType(inType)

где inType - это квалифицированное имя сборки https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx

Если вам нужна сборка загрузки, на которую не ссылается проект, используйте метод Assembly.Load.

О недостатках использования Assembly.LoadFrom прочитайте раздел Замечания в https://msdn.microsoft.com/EN-US/library/1009fa28(v=VS.110,d=hv.2).aspx

Ответ 2

красный флаг не работает на определенных машинах (1 из 100) - сколько компьютеров в итоге не работает? Это означает, что это может быть конфигурация машины, а не код. Это также затрудняет репликацию, чтобы помочь.

Если бы это был я. Я бы сделал шаг назад и упростил ситуацию. Напишите код, который просто выполняет неудачную задачу, даже с другими более простыми классами, а затем сосредоточится на неисправной машине. Получите как можно больше информации и создайте понимание.

Вероятно, это боль референта. Ситуация, с которой вы сталкиваетесь, является лишь симптомом реальной проблемы. Вы сосредоточены на коде, но это всего лишь симптом. Вот почему было бы хорошо упростить.

Надеюсь, что это поможет, я новичок в stackoverflow, и я знаю, что для вопросов есть правила. Я бы сделал этот комментарий, но у меня нет репутации.