Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
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!");
}
}
}
Обратите внимание на явную реализацию интерфейса
IAppFunctionality
IAppFunctionality
DoIt()
CSharpModule
Построение оснастки на Visual Basic
Теперь перейдите к проекту
VBSnapIn
Class1.vb
VBSnapIn.vb
Imports CommonSnappableTypes
<CompanyInfo(CompanyName:="Chucky's Software", CompanyUrl:="www.ChuckySoft.com")>
Public Class VBSnapIn
Implements IAppFunctionality
Public Sub DoIt() Implements CommonSnappableTypes.IAppFunctionality.DoIt
Console.WriteLine("You have just used the VB snap in!")
End Sub
End Class
Как видите, применение атрибутов в синтаксисе Visual Basic требует указания угловых скобок (
<>
[]
Implements
Добавление кода для ExtendableApp
Последним обновляемым проектом является консольное приложение C# (
MyExtendableApp
MyExtendableApp
CommonSnappableTypes
CSharpSnapIn.dll
VbSnapIn.dll
using
Program.cs
using 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);
}
}