Язык программирования C#9 и платформа .NET5
Часть 335 из 642 Информация о книге
using System;using CommonSnappableTypes;namespace CSharpSnapIn{[CompanyInfo(CompanyName = "FooBar", CompanyUrl = "www.FooBar.com")]public class CSharpModule : IAppFunctionality{void IAppFunctionality.DoIt(){Console.WriteLine("You have just used the C# snap-in!");}}}Обратите внимание на явную реализацию интерфейса
(см. главу 8). Поступать так необязательно; тем не менее, идея заключается в том, что единственной частью системы, которая нуждается в прямом взаимодействии с упомянутым интерфейсным типом, будет размещающее приложение. Благодаря явной реализации интерфейсаIAppFunctionalityметодIAppFunctionalityне доступен напрямую из типаDoIt().CSharpModuleПостроение оснастки на Visual Basic
Теперь перейдите к проекту
. Удалите файлVBSnapInи добавьте новый файл по имениClass1.vb. Код Visual Basic столь же прост:VBSnapIn.vbImports CommonSnappableTypes<CompanyInfo(CompanyName:="Chucky's Software", CompanyUrl:="www.ChuckySoft.com")>Public Class VBSnapInImplements IAppFunctionalityPublic Sub DoIt() Implements CommonSnappableTypes.IAppFunctionality.DoItConsole.WriteLine("You have just used the VB snap in!")End SubEnd ClassКак видите, применение атрибутов в синтаксисе Visual Basic требует указания угловых скобок (
), а не квадратных (<>). Кроме того, для реализации интерфейсных типов заданным классом или структурой используется ключевое слово[].ImplementsДобавление кода для ExtendableApp
Последним обновляемым проектом является консольное приложение C# (
). После добавления к решению консольного приложенияMyExtendableAppи установки его как стартового проекта добавьте ссылку на проектMyExtendableApp, но не наCommonSnappableTypesилиCSharpSnapIn.dll. Модифицируйте операторыVbSnapIn.dllв начале файлаusing, как показано ниже:Program.csusing System;using System.Linq;using System.Reflection;using CommonSnappableTypes;Метод
выполняет следующие действия:LoadExternalModule()• динамически загружает в память выбранную сборку;
• определяет, содержит ли сборка типы, реализующие интерфейс
;IAppFunctionality• создает экземпляр типа, используя позднее связывание.
Если обнаружен тип, реализующий
, тогда вызывается методIAppFunctionalityи найденный тип передается методуDoIt()для вывода дополнительной информации о нем посредством рефлексии.DisplayCompanyData()static void LoadExternalModule(string assemblyName){Assembly theSnapInAsm = null;try{// Динамически загрузить выбранную сборку.theSnapInAsm = Assembly.LoadFrom(assemblyName);}catch (Exception ex){// Ошибка при загрузке оснасткиConsole.WriteLine($"An error occurred loading the snapin: {ex.Message}");return;}// Получить все совместимые c IAppFunctionality классы в сборке.var theClassTypes = theSnapInAsm.GetTypes().Where(t => t.IsClass && (t.GetInterface("IAppFunctionality") != null)).ToList();if (!theClassTypes.Any()){Console.WriteLine("Nothing implements IAppFunctionality!");// Ни один класс не реализует IAppFunctionality!}// Создать объект и вызвать метод DoIt().foreach (Type t in theClassTypes){/// Использовать позднее связывание для создания экземпляра типа.IAppFunctionality itfApp =(IAppFunctionality)theSnapInAsm.CreateInstance(t.FullName,true);itfApp?.DoIt();// Отобразить информацию о компании.DisplayCompanyData(t);}}