Я пытаюсь создать подключаемый модуль типа archetecure для своего проекта. Мне бы хотелось иметь возможность загружать сборку, получать тип, производный от абстрактного базового класса в моем проекте, создавать его экземпляры и загружать этот производный тип в основной объект обработки.
Моя проблема сейчас заключается в том, что когда я создаю экземпляр объекта из отраженной сборки, он всегда равен нулю. Я чувствую, что проблема может заключаться в том, что у ссылочной сборки есть сторонние dll, которые она использует. Вот код: единственное исключение, которое получает удар, является последним.
static void Main(string[] args)
{
string engineFilePath = ConfigurationManager.AppSettings["EngineFilesDirectory"]
+ "\\" + ConfigurationManager.AppSettings["EngineDllFileName"];
Assembly asm = Assembly.LoadFile(engineFilePath);
Type engineType = asm.GetType(ConfigurationManager.AppSettings["EngineType"]);
if (!engineType.IsSubclassOf(typeof(EngineConcrete)))
{
throw new ArgumentException("Engine is not derived from base implimentation.");
}
object engineInstance = asm.CreateInstance(engineType.Namespace + "." + engineType);
if (engineInstance == null)
{
//always thrown at this point
throw new Exception(string.Format("Engine object is null."));
}
return;
}
Если я изменяю строку экземпляра на Activator.CreateInstance(engineType)
, я получаю сообщение об ошибке, в котором говорится, что один из сторонних dll, на который ссылается отраженная сборка, не может быть найден, хотя они находятся в том же каталоге, что и DLL отражение.
Существует открытый конструктор для типа, который также отражается. Он не имеет параметров и наследуется от класса EngineConcrete
.