2016-08-10 6 views
2

У меня есть dll, загружаемая во время выполнения. Я пытаюсь создать экземпляры каждого типа из динамически загружаемой dll во время выполнения и добавить эти экземпляры в список. Все классы в dll основаны на AYClass, поэтому их следует добавить в список успешно. Но я с такой ошибки, как показано нижеСоздайте список объектов из динамически загружаемой dll во время выполнения

Exception thrown: 
'Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException' in Microsoft.CSharp.dll 

Additional information: An unexpected exception occurred while binding a dynamic operation 

Мой код, как показано ниже ...

Assembly assembly = Assembly.LoadFrom(@"D:\Library\CurrencyData.dll"); 
List<AYClass> listObjects = new List<AYClass>(); 
foreach (Type type in assembly.GetExportedTypes()) 
{ 
    if (type.BaseType.ToString().Contains("AYClass")) 
    { 
     dynamic c = Activator.CreateInstance(type); 
     listObjects.Add(c); // ******* Exception is thrown here 
    } 
} 

Что я должен сделать, чтобы исправить это?

ответ

2

Почему вы используете dynamic, когда знаете базовый тип? Не делай этого. Использование вар вместо:

Assembly assembly = Assembly.LoadFrom(@"D:\Library\CurrencyData.dll"); 
List<AYClass> listObjects = new List<AYClass>(); 
foreach (Type type in assembly.GetExportedTypes()) 
{ 
    if (type.BaseType.ToString().Contains("AYClass")) 
    { 
     var c = (AYClass)Activator.CreateInstance(type); 
     listObjects.Add(c); 
    } 
} 

В общем C# является безопасным тип языка, поэтому использование dynamic должен быть исключительным. Также убедитесь, что в вашей динамически загруженной dll и в вашем «загрузчике» они используют тот же базовый класс. В любом другом случае литье экземпляра не будет выполнено.

Кроме того, вы можете заменить эту строку: if (type.BaseType.ToString().Contains("AYClass")) с указанием типа, а не его имени. Это не очень безопасно, потому что класс с тем же именем может быть объявлен в разных сборках и пространствах имен в той же сборке.

+0

привет, если вы используете «var», вы не можете использовать listObjects.add (c). вы должны использовать тип объекта для AYClass –

+1

@ayilmaz. Вы можете использовать активатор AYClass c = (AYClass). Создавать атрибут (тип); 'var - это просто сокращение, чтобы скрыть тип. 'var' все еще работает. – user3185569

+0

@BendEg, он дает мне эту ошибку. Невозможно наложить объект типа «AY.CurrencyData.Model.Currency» на тип «AY.CurrencyData.Model.AYClass». –

Смежные вопросы