Загрузка сборки C# и позднее связывание

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

В 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();

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

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

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


person subb    schedule 04.07.2009    source источник


Ответы (2)


Я просто прочитай это

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

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

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

person Sam Saffron    schedule 04.07.2009
comment
Что ж. Это интересно. В моем представлении AS3 был языком статической типизации с некоторыми динамическими функциями. Я не знаю, почему я так подумал, поскольку он основан на динамическом языке ECMAScript. Я думаю, что компилятор действительно хорошо скрывает это. Это на самом деле многое объясняет... - person subb; 04.07.2009

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

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

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

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

person Marc Gravell    schedule 04.07.2009
comment
примечание: динамическое ключевое слово немного более гибкое, чем общий интерфейс, если вы меняете версию на общем интерфейсе, вам либо нужно перекомпилировать расширение и основное приложение, либо вам нужно иметь дело с перенаправлением распознавателя. - person Sam Saffron; 04.07.2009
comment
Это то, как вы бы сделали интерфейс плагина? - person subb; 04.07.2009
comment
Это действительно один из самых распространенных вариантов API плагинов. - person Marc Gravell; 04.07.2009
comment
@Subb, см. MEF для окончательного рекомендованного Microsoft способа создания плагинов. - person Sam Saffron; 04.07.2009
comment
@Sam - в настоящее время это только предварительная версия. Возможно, в будущем оно станет окончательным [и т. д.]. - person Marc Gravell; 04.07.2009
comment
@Marc, не согласно Эрику Липперту и еще 11 членам stackoverflow >stackoverflow.com/questions/1070787/writing-c-plugin-system/, убедитесь, что вы прочитали мои комментарии: p - person Sam Saffron; 04.07.2009
comment
Вы честно утверждаете, что сейчас это не Preview 5? Мой акцент был на будущем времени... - person Marc Gravell; 04.07.2009
comment
нет, я полностью согласен с вами, это был сарказм, и он потерялся в переводе. Кто-то спросил, как мне сделать XYZ с моей системой плагинов, и самый популярный ответ был: не беспокойтесь об этом, используйте MEF. Лично моя проблема с MEF в том, что он действительно жирный и решает все проблемы для всех. Но в последнее время везде, где я слышу обсуждение плагинов, ответ, как правило, заключается в использовании MEF. - person Sam Saffron; 05.07.2009