С# лить производный класс для исключения базового класса через отражение
У меня есть приложение, которое динамически создает классы с использованием отражения. При развертывании я получаю исключение при передаче производного класса в его базовый класс. Это происходит только на 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
Ответы
Ответ 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, и я знаю, что для вопросов есть правила. Я бы сделал этот комментарий, но у меня нет репутации.