2

Я читаю this книгу на C# и .NET, и я изучаю кучу классных вещей. Я прочитал ту часть, где автор рассказывает о динамической загрузке сборки и создании экземпляра типа в этой сборке.C# Сборка и поздняя привязка

В AS3 можно сделать один и тот же материал, за исключением одного: вы можете попросить компилятор не скомпилировать набор классов, а проверить безопасность типа. Вот пример:

//Defined in an external library 
public class A {...} 


//In my application, I tell the compiler to type check A, but not compile it 
var a:A = new A(); 
a.whatever(); 

Во время выполнения в моем коде приложения, я могу динамически загружать свою внешнюю библиотеку, содержащую определение класса А, загрузите эти определения в ApplicationDomain моего приложения, и все будет работать нормально. Нет необходимости в размышлении!

Возможно ли это в C#?

Другими словами, могу ли я дать указание компилятору C# на typecheck против кучи класса (скажем, в библиотеке), но исключить их из компиляции?

ответ

1

Я просто read this

Action Script является динамическим языком, он предлагает в качестве «бонуса» в функции проверки типа, это поможет вам поймать ошибки во время компиляции, так же, как статические типизированные языки делать.

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

Однако, если вы используете какие-либо функции позднего связывания, которые имеет C#, вы не получаете проверки типа.

+0

Ну. Это интересно.В моей голове AS3 был статическим языком с некоторыми динамическими функциями. Я не знаю, почему я думал об этом, поскольку он основан на ECMAScript, динамическом языке. Я думаю, что компилятор действительно справляется с этим. Это на самом деле многое объясняет ... – subb

2

Я не на 100% понят, что делает код as3 - но похоже, что вы хотите определить общий интерфейс (в отдельной dll), который может реализовать ваша внешняя сборка, - и просто отбрасывать его при создании объект:

Type type = loadedAssembly.GetType(fullyQualifiedName); 
IMyInterface obj = (IMyInterface)Activator.CreateInstance(type): 

теперь вы можете использовать методы, определенные на obj легко.

В качестве альтернативы, в C# 4.0 ключевое слово dynamic обеспечивает утиную печать.

+0

примечание: динамическое ключевое слово немного более гибкое, чем общий интерфейс, если вы измените версию на общем интерфейсе, вам необходимо перекомпилировать как расширение, так и основное приложение, или вам нужно иметь дело с перенаправлением резольвер. –

+0

Разве это так, как вы сделали бы интерфейс плагина? – subb

+0

Это действительно один из самых распространенных вариантов для API плагинов. –

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