Showing preview only (459K chars total). Download the full file or copy to clipboard to get everything.
Repository: weikio/PluginFramework
Branch: master
Commit: 5414bf718ef3
Files: 206
Total size: 403.6 KB
Directory structure:
gitextract_7nw5d5uj/
├── .editorconfig
├── .gitignore
├── LICENSE
├── README.md
├── THIRD-PARTY-NOTICES.txt
├── docs/
│ ├── logo.pdn
│ └── logo_transparent_color.pdn
├── global.json
├── samples/
│ ├── BlazorApp/
│ │ ├── App.razor
│ │ ├── BlazorApp.csproj
│ │ ├── Data/
│ │ │ ├── WeatherForecast.cs
│ │ │ └── WeatherForecastService.cs
│ │ ├── Pages/
│ │ │ ├── Counter.razor
│ │ │ ├── Error.razor
│ │ │ ├── FetchData.razor
│ │ │ ├── Index.razor
│ │ │ └── _Host.cshtml
│ │ ├── Program.cs
│ │ ├── Shared/
│ │ │ ├── MainLayout.razor
│ │ │ ├── NavMenu.razor
│ │ │ └── SurveyPrompt.razor
│ │ ├── Startup.cs
│ │ ├── _Imports.razor
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── css/
│ │ ├── open-iconic/
│ │ │ ├── FONT-LICENSE
│ │ │ ├── ICON-LICENSE
│ │ │ ├── README.md
│ │ │ └── font/
│ │ │ └── fonts/
│ │ │ └── open-iconic.otf
│ │ └── site.css
│ ├── ConsoleApp/
│ │ ├── ConsoleApp.csproj
│ │ ├── FirstPlugin.cs
│ │ ├── MyPlugin.cs
│ │ ├── Program.cs
│ │ └── SecondPlugin.cs
│ ├── Shared/
│ │ ├── Weikio.PluginFramework.Samples.Shared/
│ │ │ ├── IMyPlugin.cs
│ │ │ ├── IOperator.cs
│ │ │ ├── IPlugin.cs
│ │ │ ├── RemainderOperator.cs
│ │ │ └── Weikio.PluginFramework.Samples.Shared.csproj
│ │ └── Weikio.PluginFramework.Samples.SharedPlugins/
│ │ ├── MinusOperator.cs
│ │ ├── MultiplyOperator.cs
│ │ ├── SecondSharedPlugin.cs
│ │ ├── SumOperator.cs
│ │ └── Weikio.PluginFramework.Samples.SharedPlugins.csproj
│ ├── WebApp/
│ │ ├── Controllers/
│ │ │ └── CalculatorController.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebApp.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppPluginsLibrary/
│ │ ├── CustomPlugin.cs
│ │ └── WebAppPluginsLibrary.csproj
│ ├── WebAppWithAppSettings/
│ │ ├── Controllers/
│ │ │ └── CalculatorController.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithAppSettings.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppWithDelegate/
│ │ ├── Controllers/
│ │ │ └── DelegateController.cs
│ │ ├── ExternalService.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithDelegate.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppWithNuget/
│ │ ├── Controllers/
│ │ │ └── CalculatorController.cs
│ │ ├── NugetLogger.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithNuget.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppWithRoslyn/
│ │ ├── Controllers/
│ │ │ └── RoslynController.cs
│ │ ├── ExternalService.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithRoslyn.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WinFormsApp/
│ │ ├── DivideOperator.cs
│ │ ├── Form1.Designer.cs
│ │ ├── Form1.cs
│ │ ├── Form1.resx
│ │ ├── Program.cs
│ │ └── WinFormsApp.csproj
│ ├── WinFormsPluginsLibrary/
│ │ ├── LabelPlugin.Designer.cs
│ │ ├── LabelPlugin.cs
│ │ ├── LabelPlugin.resx
│ │ ├── TestPlugin.Designer.cs
│ │ ├── TestPlugin.cs
│ │ ├── TestPlugin.resx
│ │ └── WinFormsPluginsLibrary.csproj
│ └── WpfApp/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── AssemblyInfo.cs
│ ├── DivideOperator.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ └── WpfApp.csproj
├── src/
│ ├── PluginFramework.sln
│ ├── Weikio.PluginFramework/
│ │ ├── Catalogs/
│ │ │ ├── AssemblyPluginCatalog.cs
│ │ │ ├── AssemblyPluginCatalogOptions.cs
│ │ │ ├── CompositePluginCatalog.cs
│ │ │ ├── Delegates/
│ │ │ │ ├── ConversionRule.cs
│ │ │ │ ├── DelegateCatalog.cs
│ │ │ │ ├── DelegatePluginCatalogOptions.cs
│ │ │ │ └── ParameterConversion.cs
│ │ │ ├── EmptyPluginCatalog.cs
│ │ │ ├── FolderPluginCatalog.cs
│ │ │ ├── FolderPluginCatalogOptions.cs
│ │ │ ├── TypePluginCatalog.cs
│ │ │ └── TypePluginCatalogOptions.cs
│ │ ├── Context/
│ │ │ ├── MetadataTypeFindingContext.cs
│ │ │ ├── PluginAssemblyLoadContext.cs
│ │ │ ├── PluginLoadContextOptions.cs
│ │ │ ├── RuntimeAssemblyHint.cs
│ │ │ └── UseHostApplicationAssembliesEnum.cs
│ │ ├── TypeFinding/
│ │ │ ├── ITypeFindingContext.cs
│ │ │ ├── TypeFinder.cs
│ │ │ ├── TypeFinderCriteria.cs
│ │ │ ├── TypeFinderCriteriaBuilder.cs
│ │ │ └── TypeFinderOptions.cs
│ │ └── Weikio.PluginFramework.csproj
│ ├── Weikio.PluginFramework.Abstractions/
│ │ ├── IPluginCatalog.cs
│ │ ├── IPluginCatalogExtensions.cs
│ │ ├── Plugin.cs
│ │ ├── PluginFrameworkOptions.cs
│ │ ├── PluginNameOptions.cs
│ │ └── Weikio.PluginFramework.Abstractions.csproj
│ ├── Weikio.PluginFramework.AspNetCore/
│ │ ├── DefaultPluginOption.cs
│ │ ├── PluginExtensions.cs
│ │ ├── PluginFrameworkInitializer.cs
│ │ ├── PluginProvider.cs
│ │ ├── ServiceCollectionExtensions.cs
│ │ ├── ServiceProviderExtensions.cs
│ │ └── Weikio.PluginFramework.AspNetCore.csproj
│ ├── Weikio.PluginFramework.Catalogs.NuGet/
│ │ ├── NugetFeedPluginCatalog.cs
│ │ ├── NugetFeedPluginCatalogOptions.cs
│ │ ├── NugetPackagePluginCatalog.cs
│ │ ├── NugetPluginCatalogOptions.cs
│ │ └── Weikio.PluginFramework.Catalogs.NuGet.csproj
│ ├── Weikio.PluginFramework.Catalogs.Roslyn/
│ │ ├── InvalidCodeException.cs
│ │ ├── RegularInitializer.cs
│ │ ├── RoslynPluginCatalog.cs
│ │ ├── RoslynPluginCatalogOptions.cs
│ │ ├── ScriptInitializer.cs
│ │ └── Weikio.PluginFramework.Catalogs.Roslyn.csproj
│ └── Weikio.PluginFramework.Configuration/
│ ├── CatalogConfiguration.cs
│ ├── Converters/
│ │ ├── AssemblyCatalogConfigurationCoverter.cs
│ │ ├── FolderCatalogConfigurationConverter.cs
│ │ └── IConfigurationToCatalogConverter.cs
│ ├── Providers/
│ │ ├── IPluginCatalogConfigurationLoader.cs
│ │ └── PluginCatalogConfigurationLoader.cs
│ └── Weikio.PluginFramework.Configuration.csproj
└── tests/
├── Assemblies/
│ ├── JsonNetNew/
│ │ ├── JsonNetNew.csproj
│ │ └── NewJsonResolver.cs
│ ├── JsonNetOld/
│ │ ├── JsonNetOld.csproj
│ │ └── OldJsonResolver.cs
│ ├── TestAssembly1/
│ │ ├── FirstPlugin.cs
│ │ ├── INotPluginInterface.cs
│ │ ├── NotAPlugin.cs
│ │ └── TestAssembly1.csproj
│ ├── TestAssembly2/
│ │ ├── SecondPlugin.cs
│ │ └── TestAssembly2.csproj
│ ├── TestAssembly3/
│ │ ├── TestAssembly3.csproj
│ │ └── ThirdAddon.cs
│ └── TestIntefaces/
│ ├── ICommand.cs
│ ├── IJsonVersionResolver.cs
│ └── TestIntefaces.csproj
├── integration/
│ ├── WebSites/
│ │ └── PluginFrameworkTestBed/
│ │ ├── Controllers/
│ │ │ └── WeatherForecastController.cs
│ │ ├── PluginFrameworkTestBed.csproj
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WeatherForecast.cs
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Weikio.PluginFramework.AspNetCore.IntegrationTests/
│ │ ├── DefaultPluginTypeTests.cs
│ │ ├── TestBase.cs
│ │ ├── Weikio.PluginFramework.AspNetCore.IntegrationTests.csproj
│ │ └── xunit.runner.json
│ └── Weikio.PluginFramework.Catalogs.NuGet.Tests/
│ ├── NotThreadSafeResourceCollection.cs
│ ├── NuGet.Config
│ ├── NugetFeedPluginCatalogTests.cs
│ ├── NugetPackagePluginCatalogTests.cs
│ └── Weikio.PluginFramework.Catalogs.NuGet.Tests.csproj
└── unit/
├── Weikio.PluginFramework.Catalogs.Roslyn.Tests/
│ ├── RegularInitializerTests.cs
│ ├── RoslynPluginCatalogTests.cs
│ ├── ScriptInitializerTests.cs
│ ├── TestHelpers.cs
│ └── Weikio.PluginFramework.Catalogs.Roslyn.Tests.csproj
└── Weikio.PluginFramework.Tests/
├── AssemblyPluginCatalogTests.cs
├── DefaultOptionsTests.cs
├── DelegateCatalogTests.cs
├── FolderCatalogTests.cs
├── NotThreadSafeResourceCollection.cs
├── Plugins/
│ ├── AbstractPluginWithAttribute.cs
│ ├── AnotherPluginWithAttribute.cs
│ ├── MyPluginAttribute.cs
│ ├── PluginWithAttribute.cs
│ ├── TypePlugin.cs
│ └── TypePluginWithName.cs
├── TagTests.cs
├── TypeFinderTests.cs
├── TypePluginCatalogTests.cs
└── Weikio.PluginFramework.Tests.csproj
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root=true
# EditorConfig is awesome:http://EditorConfig.org
# top-most EditorConfig file
root = true
# Don't use tabs for indentation.
[*]
indent_style=space
charset=utf-8
end_of_line=crlf
trim_trailing_whitespace=false
insert_final_newline=false
indent_size=4
# Microsoft .NET properties
csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
dotnet_style_require_accessibility_modifiers=for_non_interface_members:hint
# ReSharper properties
resharper_autodetect_indent_settings=true
resharper_blank_lines_after_control_transfer_statements=1
resharper_blank_lines_around_block_case_section=1
resharper_blank_lines_around_single_line_local_method=1
resharper_blank_lines_before_block_statements=1
resharper_blank_lines_before_control_transfer_statements=1
resharper_blank_lines_before_multiline_statements=1
resharper_blank_lines_before_single_line_comment=1
resharper_braces_for_for=required
resharper_braces_for_foreach=required
resharper_braces_for_ifelse=required
resharper_braces_for_while=required
resharper_csharp_keep_blank_lines_in_code=1
resharper_csharp_keep_blank_lines_in_declarations=1
resharper_csharp_max_line_length=160
resharper_enforce_line_ending_style=true
resharper_keep_existing_embedded_arrangement=false
resharper_place_simple_embedded_statement_on_same_line=False
resharper_use_indent_from_vs=false
resharper_space_within_single_line_array_initializer_braces=true
resharper_accessor_owner_body=accessors_with_block_body
# ReSharper inspection severities
resharper_convert_to_null_coalescing_compound_assignment_highlighting=hint
resharper_enforce_foreach_statement_braces_highlighting=error
resharper_enforce_for_statement_braces_highlighting=error
resharper_enforce_if_statement_braces_highlighting=error
resharper_enforce_while_statement_braces_highlighting=error
resharper_identifier_typo_highlighting=none
resharper_redundant_base_qualifier_highlighting=warning
resharper_web_config_module_not_resolved_highlighting=warning
resharper_web_config_type_not_resolved_highlighting=warning
resharper_web_config_wrong_module_highlighting=warning
# (Please don't specify an indent_size here; that has too many unintended consequences.)
# Code files
[*.{cs,csx,vb,vbx}]
indent_size=4
insert_final_newline=true
# Xml project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size=2
# Xml config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size=2
# JSON files
[*.json]
indent_size=2
# Dotnet code style settings:
[*.{cs,vb}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first=true
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field=false:error
dotnet_style_qualification_for_property=false:error
dotnet_style_qualification_for_method=false:error
dotnet_style_qualification_for_event=false:error
# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members=true:suggestion
dotnet_style_predefined_type_for_member_access=true:suggestion
# Suggest more modern language features when available
dotnet_style_object_initializer=true:suggestion
dotnet_style_collection_initializer=true:suggestion
dotnet_style_coalesce_expression=true:suggestion
dotnet_style_null_propagation=true:suggestion
dotnet_style_explicit_tuple_names=true:suggestion
dotnet_naming_rule.private_members_with_underscore.symbols=private_fields
dotnet_naming_rule.private_members_with_underscore.style=prefix_underscore
dotnet_naming_rule.private_members_with_underscore.severity=suggestion
dotnet_naming_symbols.private_fields.applicable_kinds=field
dotnet_naming_symbols.private_fields.applicable_accessibilities=private
dotnet_naming_style.prefix_underscore.capitalization=camel_case
dotnet_naming_style.prefix_underscore.required_prefix=_
# CSharp code style settings:
[*.cs]
# Prefer "var" everywhere
csharp_style_var_for_built_in_types=true:error
csharp_style_var_when_type_is_apparent=true:error
csharp_style_var_elsewhere=true:error
# Prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods=false:none
csharp_style_expression_bodied_constructors=false:none
csharp_style_expression_bodied_operators=false:none
# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties=true:none
csharp_style_expression_bodied_indexers=true:none
csharp_style_expression_bodied_accessors=true:none
# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check=true:suggestion
csharp_style_pattern_matching_over_as_with_null_check=true:suggestion
csharp_style_inlined_variable_declaration=true:suggestion
csharp_style_throw_expression=true:suggestion
csharp_style_conditional_delegate_call=true:suggestion
# Newline settings
csharp_new_line_before_open_brace=all
csharp_new_line_before_else=true
csharp_new_line_before_catch=true
csharp_new_line_before_finally=true
csharp_new_line_before_members_in_object_initializers=true
csharp_new_line_before_members_in_anonymous_types=true
csharp_new_line_between_query_expression_clauses=true
csharp_preserve_single_line_statements=false
csharp_preserve_single_line_blocks=true
[{.eslintrc,.babelrc,.stylelintrc,jest.config,*.uproject,*.bowerrc,*.jsb3,*.jsb2,*.json}]
indent_style=space
indent_size=2
[*.{appxmanifest,asax,ascx,aspx,build,cs,cshtml,dtd,master,nuspec,razor,resw,resx,skin,vb,xaml,xamlx,xoml,xsd}]
indent_style=space
indent_size=4
tab_width=4
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2019 Weik.io
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<img align="right" alt="Plugin Framework Logo" src="docs/logo_transparent_color_256.png">
# Plugin Framework for .NET Core [](https://www.nuget.org/packages/Weikio.PluginFramework/)
With Plugin Framework for .NET Core, everything is a plugin! Plugin Framework is a **plugin platform** for .NET Core applications, including **ASP.NET Core, Blazor, WPF, Windows Forms and Console apps**. It is light-weight and easy to integrate and supports multiple different plugin catalogs, including .NET assemblies, **Nuget packages** and **Roslyn scripts**.
### Main Features
Here are some of the main features of Plugin Framework:
* Everything is a plugin! Deliver plugins as Nuget-packages, .NET assemblies, Roslyn scripts and more.
* Easy integration into a new or an existing .NET Core application.
* Automatic dependency management.
* Handles platform specific runtime DLLs and native DLLs when using Nuget-packages.
* MIT-licensed, commercial support available.
## Quickstart: Plugin Framework & ASP.NET Core
Plugin Framework is available from Nuget as a .NET Core 3.1 package. There's a separate package which makes it easier to work with plugins in an ASP.NET Core app:
[](https://www.nuget.org/packages/Weikio.PluginFramework.AspNetCore/)
```
Install-Package Weikio.PluginFramework.AspNetCore
```
Using Plugin Framework can be as easy as adding a single new line into ConfigureServices:
```
services.AddPluginFramework<IOperator>(@".\myplugins");
```
The code finds all the plugins (types that implement the custom IOperator-interface) from the myplugins-folder. The plugins can be used in a controller using constructor injection:
```
public CalculatorController(IEnumerable<IOperator> operator)
{
_operators = operators;
}
```
Alternatively, you can provide multiple plugin locations using catalogs:
```
var folderPluginCatalog = new FolderPluginCatalog(@".\myplugins", type =>
{
type.Implements<IOperator>();
});
var anotherPluginCatalog = new FolderPluginCatalog(@".\morePlugins", type =>
{
type.Implements<IOperator>();
});
services.AddPluginFramework()
.AddPluginCatalog(folderPluginCatalog)
.AddPluginCatalog(anotherPluginCatalog)
.AddPluginType<IOperator>();
```
## Samples
The following Plugin Framework samples are available from GitHub:
#### [Plugin Framework & .NET Console Application](https://github.com/weikio/PluginFramework/tree/master/samples/ConsoleApp)
#### [Plugin Framework & ASP.NET Core](https://github.com/weikio/PluginFramework/tree/master/samples/WebApp)
#### [Plugin Framework & Blazor](https://github.com/weikio/PluginFramework/tree/master/samples/BlazorApp)
#### [Plugin Framework & WPF App](https://github.com/weikio/PluginFramework/tree/master/samples/WpfApp)
#### [Plugin Framework & WinForms App](https://github.com/weikio/PluginFramework/tree/master/samples/WinFormsApp)
#### [Nuget & Plugin Framework & ASP.NET Core](https://github.com/weikio/PluginFramework/tree/master/samples/WebAppWithNuget)
#### [Roslyn & Plugin Framework & ASP.NET Core](https://github.com/weikio/PluginFramework/tree/master/samples/WebAppWithRoslyn)
#### [Delegates & Plugin Framework & ASP.NET Core](https://github.com/weikio/PluginFramework/tree/master/samples/WebAppWithDelegate)
#### [Tagging & WinForms App](https://github.com/weikio/PluginFramework/tree/master/samples/WinFormsApp)
#### [AppSettings.json & ASP.NET Core](https://github.com/weikio/PluginFramework/tree/master/samples/WebAppWithAppSettings)
## Background and introduction
For more details related to Plugin Framework's background, please see the following [introduction article from InfoQ](https://www.infoq.com/articles/Plugin-Framework-DotNet/).
## Main concepts
Using Plugin Framework concentrates around two concepts: **Plugins** and **Plugin Catalogs**.
### Plugin
Plugins are software programs, which provide extensions to an application. Plugins are designed to work with a single application. This app is often called the **host application**. The host application is designed in such a way that it can locate and run plugins dynamically, runtime. **The application works without the plugins, the plugins can't work without the host application.**
The host application defines the specifications for the plugins. In some applications a plugin can add new functionality into the UI. In other apps, plugins are used to distribute logs into multiple different systems. The host application defines what kind of extensions it supports.
Plugin-based software architecture can help in the following scenarios:
* Adding new features to application after the release
* Splitting large systems into smaller parts
* Updating always-on software system without restarting it
Plugins are dynamic, and they are often only loaded when the application needs them. Plugins are not usually compiled as part of the system but distributed as separate packages (assemblies, Nuget packages).
In the context of the Plugin Framework, **plugin is a single .NET Type**. What makes a plugin? As described previously, it depends on the host application. For some applications a plugin is a type which implements a specific interface. In some applications a plugin is a type which has a single public method called Run. Attributes are often used to indicate the plugins and that is also supported by Plugin Framework. From the Plugin Framework's point of view anything or everything can be a plugin.
As mentioned, in Plugin Framework a single plugin is a .NET Type. Even though Plugin Framework's ASP.NET Core support makes it easy to instantiate and use plugins in services and controllers through dependency injection (IServiceProvider), Plugin Framework itself doesn't provide any built-in mechanisms for creating instances (objects) from the plugins (types). In some cases Activator.CreateInstance is all that is needed and in some cases it is best to hook Plugin Framework with the app's DI-system. The requirements are host application specific.
In Plugin Framework, each Plugin is composed of the following information:
* Type
* Plugin name
* Plugin version
### Plugin Catalogs
Plugin Framework contains a concept called "Catalog". A single assembly can be a catalog. A .NET type can be a catalog. Folders with dlls are often used as catalogs and Plugin Framework also supports Nuget packages, Nuget feeds and Roslyn scripts as Plugin catalogs. Multiple catalogs are often combined into a single Composite catalog.
Each catalog contains 0-n plugins.
Plugin Framework provides the following officially supported catalogs:
* Type
* Assembly
* Folder
* Delegate (Action or a Func) ([Documentation](https://github.com/weikio/PluginFramework/wiki/Delegate-Plugin-Catalog))
* Roslyn script ([Nuget: Weikio.PluginFramework.Catalogs.Roslyn](https://www.nuget.org/packages/Weikio.PluginFramework.Catalogs.Roslyn/), [Documentation](https://github.com/weikio/PluginFramework/wiki/Roslyn-Plugin-Catalog))
* Nuget package ([Nuget: Weikio.PluginFramework.Catalogs.Nuget](https://www.nuget.org/packages/Weikio.PluginFramework.Catalogs.Nuget/))
* Nuget feed ([Nuget: Weikio.PluginFramework.Catalogs.Nuget](https://www.nuget.org/packages/Weikio.PluginFramework.Catalogs.Nuget/))
## Source code
Source code for Plugin Framework is available from [GitHub](https://github.com/weikio/PluginFramework).
## Support & Build by
Plugin Framework is build by [Adafy](https://adafy.com). Adafy also provides commercial support for the framework.

Adafy is a Finnish software development house, focusing on Microsoft technologies.
## Constributors
Thanks to the following contributors who have helped with the project:
#### [@panoukos41](https://github.com/panoukos41)
## License
Plugin Framework is available as an open source, MIT-licensed project.
================================================
FILE: THIRD-PARTY-NOTICES.txt
================================================
Plugin Framework uses third-party libraries or other resources that may be
distributed under licenses different than the Plugin Framework software.
In the event that we accidentally failed to list a required notice, please
bring it to our attention. Post an issue or email us:
info@weik.io
License notice for Minver
------------------------------------
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
License notice for ASP.NET Core
------------------------------------
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: global.json
================================================
{
"sdk": {
"version": "6.0.420"
}
}
================================================
FILE: samples/BlazorApp/App.razor
================================================
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
================================================
FILE: samples/BlazorApp/BlazorApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Content Update="Properties\launchSettings.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project>
================================================
FILE: samples/BlazorApp/Data/WeatherForecast.cs
================================================
using System;
namespace BlazorApp.Data
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int) (TemperatureC / 0.5556);
public string Summary { get; set; }
}
}
================================================
FILE: samples/BlazorApp/Data/WeatherForecastService.cs
================================================
using System;
using System.Linq;
using System.Threading.Tasks;
namespace BlazorApp.Data
{
public class WeatherForecastService
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
{
var rng = new Random();
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)]
}).ToArray());
}
}
}
================================================
FILE: samples/BlazorApp/Pages/Counter.razor
================================================
@page "/counter"
@implements Weikio.PluginFramework.Samples.Shared.IWidget
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
public string Title
{
get { return "Counter Widget"; }
}
}
================================================
FILE: samples/BlazorApp/Pages/Error.razor
================================================
@page "/error"
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
================================================
FILE: samples/BlazorApp/Pages/FetchData.razor
================================================
@page "/fetchdata"
@implements Weikio.PluginFramework.Samples.Shared.IWidget
@using BlazorApp.Data
@inject WeatherForecastService ForecastService
@if (forecasts == null)
{
<p>
<em>Loading...</em>
</p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[] forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
}
public string Title { get; } = "Weather forecasts";
}
================================================
FILE: samples/BlazorApp/Pages/Index.razor
================================================
@page "/"
@using Weikio.PluginFramework.Samples.Shared
<h1>Widget dashboard</h1>
<div class="row">
@foreach (var widget in Widgets)
{
<div class="col-6">
<div class="widget">
<h1>@widget.Title</h1>
<hr/>
@RenderWidget(widget)
</div>
</div>
}
</div>
@code{
[Inject]
public IEnumerable<IWidget> Widgets { get; set; }
private RenderFragment RenderWidget(IWidget widget)
{
return new RenderFragment(builder =>
{
builder.OpenComponent(0, widget.GetType());
builder.CloseComponent();
});
}
}
================================================
FILE: samples/BlazorApp/Pages/_Host.cshtml
================================================
@page "/"
@namespace BlazorApp.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>BlazorApp</title>
<base href="~/"/>
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css"/>
<link href="css/site.css" rel="stylesheet"/>
</head>
<body>
<app>
<component type="typeof(App)" render-mode="ServerPrerendered"/>
</app>
<div id="blazor-error-ui">
<environment include="Staging,Production">
An error has occurred. This application may no longer respond until reloaded.
</environment>
<environment include="Development">
An unhandled exception has occurred. See browser dev tools for details.
</environment>
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="_framework/blazor.server.js"></script>
</body>
</html>
================================================
FILE: samples/BlazorApp/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace BlazorApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
================================================
FILE: samples/BlazorApp/Shared/MainLayout.razor
================================================
@inherits LayoutComponentBase
<div class="sidebar">
<NavMenu/>
</div>
<div class="main">
<div class="top-row px-4">
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>
<div class="content px-4">
@Body
</div>
</div>
================================================
FILE: samples/BlazorApp/Shared/NavMenu.razor
================================================
<div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">Plugin Framework</a>
<button class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Dashboard
</NavLink>
</li>
</ul>
</div>
@code {
private bool collapseNavMenu = true;
private string NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}
================================================
FILE: samples/BlazorApp/Shared/SurveyPrompt.razor
================================================
@implements Weikio.PluginFramework.Samples.Shared.IWidget
<div class="alert alert-secondary mt-4" role="alert">
<span class="oi oi-pencil mr-2" aria-hidden="true"></span>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold" href="https://go.microsoft.com/fwlink/?linkid=2112271">brief survey</a>
</span>
and tell us what you think.
</div>
@code {
public string Title { get; } = "Surveys";
}
================================================
FILE: samples/BlazorApp/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using BlazorApp.Data;
using Microsoft.CodeAnalysis;
using Weikio.PluginFramework.Samples.Shared;
namespace BlazorApp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddPluginFramework<IWidget>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
}
}
================================================
FILE: samples/BlazorApp/_Imports.razor
================================================
@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.JSInterop
@using BlazorApp
@using BlazorApp.Shared
================================================
FILE: samples/BlazorApp/appsettings.Development.json
================================================
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
================================================
FILE: samples/BlazorApp/appsettings.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
================================================
FILE: samples/BlazorApp/wwwroot/css/open-iconic/FONT-LICENSE
================================================
SIL OPEN FONT LICENSE Version 1.1
Copyright (c) 2014 Waybury
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
================================================
FILE: samples/BlazorApp/wwwroot/css/open-iconic/ICON-LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2014 Waybury
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: samples/BlazorApp/wwwroot/css/open-iconic/README.md
================================================
[Open Iconic v1.1.1](http://useiconic.com/open)
===========
### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons)
## What's in Open Iconic?
* 223 icons designed to be legible down to 8 pixels
* Super-light SVG files - 61.8 for the entire set
* SVG sprite—the modern replacement for icon fonts
* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats
* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats
* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px.
## Getting Started
#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections.
### General Usage
#### Using Open Iconic's SVGs
We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute).
```
<img src="/open-iconic/svg/icon-name.svg" alt="icon name">
```
#### Using Open Iconic's SVG Sprite
Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack.
Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `<svg>` *tag and a unique class name for each different icon in the* `<use>` *tag.*
```
<svg class="icon">
<use xlink:href="open-iconic.svg#account-login" class="icon-account-login"></use>
</svg>
```
Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `<svg>` tag with equal width and height dimensions.
```
.icon {
width: 16px;
height: 16px;
}
```
Coloring icons is even easier. All you need to do is set the `fill` rule on the `<use>` tag.
```
.icon-account-login {
fill: #f00;
}
```
To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/).
#### Using Open Iconic's Icon Font...
##### …with Bootstrap
You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}`
```
<link href="/open-iconic/font/css/open-iconic-bootstrap.css" rel="stylesheet">
```
```
<span class="oi oi-icon-name" title="icon name" aria-hidden="true"></span>
```
##### …with Foundation
You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}`
```
<link href="/open-iconic/font/css/open-iconic-foundation.css" rel="stylesheet">
```
```
<span class="fi-icon-name" title="icon name" aria-hidden="true"></span>
```
##### …on its own
You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}`
```
<link href="/open-iconic/font/css/open-iconic.css" rel="stylesheet">
```
```
<span class="oi" data-glyph="icon-name" title="icon name" aria-hidden="true"></span>
```
## License
### Icons
All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT).
### Fonts
All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web).
================================================
FILE: samples/BlazorApp/wwwroot/css/site.css
================================================
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
a, .btn-link {
color: #0366d6;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
app {
position: relative;
display: flex;
flex-direction: column;
}
.top-row {
height: 3.5rem;
display: flex;
align-items: center;
}
.main {
flex: 1;
}
.main .top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
}
.main .top-row > a, .main .top-row .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
}
.main .top-row a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.sidebar .top-row {
background-color: rgba(0,0,0,0.4);
}
.sidebar .navbar-brand {
font-size: 1.1rem;
}
.sidebar .oi {
width: 2rem;
font-size: 1.1rem;
vertical-align: text-top;
top: -2px;
}
.sidebar .nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.sidebar .nav-item:first-of-type {
padding-top: 1rem;
}
.sidebar .nav-item:last-of-type {
padding-bottom: 1rem;
}
.sidebar .nav-item a {
color: #d7d7d7;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.sidebar .nav-item a.active {
background-color: rgba(255,255,255,0.25);
color: white;
}
.sidebar .nav-item a:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.content {
padding-top: 1.1rem;
}
.navbar-toggler {
background-color: rgba(255, 255, 255, 0.1);
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid red;
}
.validation-message {
color: red;
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
@media (max-width: 767.98px) {
.main .top-row:not(.auth) {
display: none;
}
.main .top-row.auth {
justify-content: space-between;
}
.main .top-row a, .main .top-row .btn-link {
margin-left: 0;
}
}
@media (min-width: 768px) {
app {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.main .top-row {
position: sticky;
top: 0;
}
.main > div {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
.navbar-toggler {
display: none;
}
.sidebar .collapse {
/* Never collapse the sidebar for wide screens */
display: block;
}
}
.widget {
border: 1px solid #ccc;
margin: 10px;
padding: 10px;
}
================================================
FILE: samples/ConsoleApp/ConsoleApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.Abstractions\Weikio.PluginFramework.Abstractions.csproj" />
<ProjectReference Include="..\..\src\Weikio.PluginFramework\Weikio.PluginFramework.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
</Project>
================================================
FILE: samples/ConsoleApp/FirstPlugin.cs
================================================
using System;
using Weikio.PluginFramework.Samples.Shared;
namespace ConsoleApp
{
public class FirstPlugin : IPlugin
{
public void Run()
{
Console.WriteLine("First plugin");
}
}
}
================================================
FILE: samples/ConsoleApp/MyPlugin.cs
================================================
using System;
using Weikio.PluginFramework.Samples.Shared;
namespace ConsoleApp
{
public class MyPlugin : IMyPlugin
{
public void Run()
{
Console.WriteLine("My plugin which implements IMyPlugin");
}
}
}
================================================
FILE: samples/ConsoleApp/Program.cs
================================================
using System;
using System.Threading.Tasks;
using Weikio.PluginFramework.Samples.Shared;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs;
namespace ConsoleApp
{
class Program
{
static async Task Main(string[] args)
{
await AssemblyCatalogSample();
await TypeCatalogSample();
await CompositeCatalogSample();
}
private static async Task AssemblyCatalogSample()
{
Console.WriteLine("Assembly catalog sample");
// 1. Create a new plugin catalog from the current assembly
var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Program).Assembly, type => typeof(IPlugin).IsAssignableFrom(type));
// 2. Initialize the catalog
await assemblyPluginCatalog.Initialize();
// 3. Get the plugins from the catalog
var assemplyPlugins = assemblyPluginCatalog.GetPlugins();
foreach (var plugin in assemplyPlugins)
{
var inst = (IPlugin) Activator.CreateInstance(plugin);
inst.Run();
}
}
private static async Task TypeCatalogSample()
{
Console.WriteLine("Type catalog sample");
var typePluginCatalog = new TypePluginCatalog(typeof(FirstPlugin));
await typePluginCatalog.Initialize();
var typePlugin = typePluginCatalog.Get();
var pluginInstance = (IPlugin) Activator.CreateInstance(typePlugin);
pluginInstance.Run();
}
private static async Task CompositeCatalogSample()
{
Console.WriteLine("Composite catalog sample");
// 1. Create a new plugin catalog from the current assembly
var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Program).Assembly, type => typeof(IPlugin).IsAssignableFrom(type));
// 2. Also create a new plugin catalog from a type
var typePluginCatalog = new TypePluginCatalog(typeof(MyPlugin));
// 3. Then combine the catalogs into a composite catalog
var compositeCatalog = new CompositePluginCatalog(assemblyPluginCatalog, typePluginCatalog);
// 4. Initialize the composite catalog
await compositeCatalog.Initialize();
// 5. Get the plugins from the catalog
var assemplyPlugins = compositeCatalog.GetPlugins();
foreach (var plugin in assemplyPlugins)
{
if (plugin.Type.Name == "MyPlugin")
{
var inst = (IMyPlugin) Activator.CreateInstance(plugin);
inst.Run();
}
else
{
var inst = (IPlugin) Activator.CreateInstance(plugin);
inst.Run();
}
}
}
}
}
================================================
FILE: samples/ConsoleApp/SecondPlugin.cs
================================================
using System;
using Weikio.PluginFramework.Samples.Shared;
namespace ConsoleApp
{
public class SecondPlugin : IPlugin
{
public void Run()
{
Console.WriteLine("Second plugin");
}
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/IMyPlugin.cs
================================================
namespace Weikio.PluginFramework.Samples.Shared
{
public interface IMyPlugin
{
void Run();
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/IOperator.cs
================================================
namespace Weikio.PluginFramework.Samples.Shared
{
public interface IOperator
{
int Calculate(int x, int y);
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/IPlugin.cs
================================================
using System;
namespace Weikio.PluginFramework.Samples.Shared
{
public interface IPlugin
{
void Run();
}
public interface IOutPlugin
{
string Get();
}
public interface IWidget
{
string Title { get; }
}
public interface IDialog
{
void Show();
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/RemainderOperator.cs
================================================
namespace Weikio.PluginFramework.Samples.Shared
{
public class RemainderOperator : IOperator
{
public int Calculate(int x, int y)
{
return x % y;
}
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/Weikio.PluginFramework.Samples.Shared.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>true</IsPackable>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Description>Plugin Framework shared sample</Description>
<PackageDescription>Plugin Framework shared sample</PackageDescription>
<Title>Plugin Framework shared sample</Title>
<PackageId>Weikio.PluginFramework.Samples.Shared</PackageId>
<Product>Weikio.PluginFramework.Samples.Shared</Product>
<AssemblyName>Weikio.PluginFramework.Samples.Shared</AssemblyName>
<PackageTags>plugins;addons;plugin framework;samples</PackageTags>
</PropertyGroup>
</Project>
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/MinusOperator.cs
================================================
using Weikio.PluginFramework.Samples.Shared;
namespace Weikio.PluginFramework.Samples.SharedPlugins
{
public class MinusOperator : IOperator
{
public int Calculate(int x, int y)
{
return x - y;
}
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/MultiplyOperator.cs
================================================
using System.ComponentModel;
using Weikio.PluginFramework.Samples.Shared;
namespace Weikio.PluginFramework.Samples.SharedPlugins
{
[DisplayName("The multiplier plugin")]
public class MultiplyOperator : IOperator
{
public int Calculate(int x, int y)
{
return x * y;
}
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/SecondSharedPlugin.cs
================================================
using System;
using Weikio.PluginFramework.Samples.Shared;
namespace Weikio.PluginFramework.Samples.SharedPlugins
{
public class SecondSharedPlugin : IOutPlugin
{
public string Get()
{
return "Second shared plugin";
}
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/SumOperator.cs
================================================
using Weikio.PluginFramework.Samples.Shared;
namespace Weikio.PluginFramework.Samples.SharedPlugins
{
public class SumOperator : IOperator
{
public int Calculate(int x, int y)
{
return x + y;
}
}
}
================================================
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/Weikio.PluginFramework.Samples.SharedPlugins.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>true</IsPackable>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Description>Plugin Framework shared sample plugins</Description>
<PackageDescription>Plugin Framework shared sample plugins</PackageDescription>
<Title>Plugin Framework shared sample plugins</Title>
<PackageId>Weikio.PluginFramework.Samples.SharedPlugins</PackageId>
<Product>Weikio.PluginFramework.Samples.SharedPlugins</Product>
<AssemblyName>Weikio.PluginFramework.Samples.SharedPlugins</AssemblyName>
<PackageTags>plugins;addons;plugin framework;samples</PackageTags>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj"/>
</ItemGroup>
</Project>
================================================
FILE: samples/WebApp/Controllers/CalculatorController.cs
================================================
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
using Weikio.PluginFramework.Samples.Shared;
using Weikio.PluginFramework.Abstractions;
namespace WebApp.Controllers
{
[ApiController]
[Route("[controller]")]
public class CalculatorController : ControllerBase
{
private readonly IEnumerable<IOperator> _operators;
private readonly IEnumerable<Plugin> _plugins;
private readonly IOperator _defaultOperator;
public CalculatorController(IEnumerable<IOperator> operators, IEnumerable<Plugin> plugins, IOperator defaultOperator)
{
_operators = operators;
_plugins = plugins;
_defaultOperator = defaultOperator;
}
[HttpGet]
public string Get()
{
return JsonSerializer.Serialize(new
{
allPlugins = _plugins.Select(p => p.ToString()),
operators = _operators.Select(o => o.GetType().Name),
defaultOperator = _defaultOperator.GetType().Name
}, new JsonSerializerOptions { WriteIndented = true});
}
}
}
================================================
FILE: samples/WebApp/Program.cs
================================================
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
namespace WebApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
================================================
FILE: samples/WebApp/Startup.cs
================================================
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Weikio.PluginFramework.Samples.Shared;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.AspNetCore;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Samples.SharedPlugins;
namespace WebApp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
var folderPluginCatalog = new FolderPluginCatalog(@"..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1", type =>
{
type.Implements<IOperator>();
});
services.AddPluginFramework()
.AddPluginCatalog(folderPluginCatalog)
.AddPluginType<IOperator>(configureDefault: option =>
{
option.DefaultType = (provider, types) => typeof(SumOperator);
});
// Alternatively
// services.AddPluginFramework<IOperator>(@"..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1");
// Default plugin type returned can be optionally configured with DefaultType function
//services.AddPluginFramework()
// .AddPluginCatalog(folderPluginCatalog)
// .AddPluginType<IOperator>(configureDefault: option =>
// {
// option.DefaultType = (serviceProvider, implementingTypes) => typeof(MultiplyOperator);
// });
// Alternatively default plugin type can be also configured with Configure and provided with the same DefaultType function
//services.Configure<DefaultPluginOption>(nameof(IOperator), option =>
// option.DefaultType = (serviceProvider, implementingTypes) => typeof(MultiplyOperator));
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
================================================
FILE: samples/WebApp/WebApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\Weikio.PluginFramework.Samples.SharedPlugins.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Content Update="Properties\launchSettings.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project>
================================================
FILE: samples/WebApp/appsettings.Development.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
================================================
FILE: samples/WebApp/appsettings.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
================================================
FILE: samples/WebAppPluginsLibrary/CustomPlugin.cs
================================================
using System;
namespace WebAppPluginsLibrary
{
public class CustomPlugin
{
}
}
================================================
FILE: samples/WebAppPluginsLibrary/WebAppPluginsLibrary.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
================================================
FILE: samples/WebAppWithAppSettings/Controllers/CalculatorController.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.AspNetCore;
using Weikio.PluginFramework.Samples.Shared;
namespace WebAppWithAppSettings.Controllers
{
[ApiController]
[Route("[controller]")]
public class CalculatorController : ControllerBase
{
private readonly IEnumerable<Plugin> _plugins;
private readonly IServiceProvider _serviceProvider;
private readonly PluginProvider _pluginProvider;
public CalculatorController(IEnumerable<Plugin> plugins, IServiceProvider serviceProvider, PluginProvider pluginProvider)
{
_plugins = plugins;
_serviceProvider = serviceProvider;
_pluginProvider = pluginProvider;
}
[HttpGet]
public string Get()
{
var result = new StringBuilder();
result.AppendLine("All:");
foreach (var plugin in _plugins)
{
result.AppendLine($"{plugin.Name}: {plugin.Version}, Tags: {string.Join(", ", plugin.Tags)}");
}
var mathPlugins = _pluginProvider.GetByTag("MathOperator");
var value1 = 10;
var value2 = 20;
result.AppendLine($"Math operations with values {value1} and {value2}");
foreach (var mathPlugin in mathPlugins)
{
var mathPluginInstance = _serviceProvider.Create<IOperator>(mathPlugin);
var mathResult = mathPluginInstance.Calculate(value1, value2);
result.AppendLine($"{mathPlugin.Name}: {mathResult}");
}
return result.ToString();
}
}
}
================================================
FILE: samples/WebAppWithAppSettings/Program.cs
================================================
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace WebAppWithAppSettings
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
================================================
FILE: samples/WebAppWithAppSettings/Startup.cs
================================================
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Weikio.PluginFramework.Samples.Shared;
using Weikio.PluginFramework.TypeFinding;
namespace WebAppWithAppSettings
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().Implements<IOperator>().Tag("MathOperator"));
TypeFinderOptions.Defaults.TypeFinderCriterias.Add(TypeFinderCriteriaBuilder.Create().Tag("All"));
services.AddPluginFramework();
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
================================================
FILE: samples/WebAppWithAppSettings/WebAppWithAppSettings.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\Weikio.PluginFramework.Samples.SharedPlugins.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
<ProjectReference Include="..\WebAppPluginsLibrary\WebAppPluginsLibrary.csproj" />
</ItemGroup>
<ItemGroup>
<Content Update="Properties\launchSettings.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project>
================================================
FILE: samples/WebAppWithAppSettings/appsettings.Development.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
================================================
FILE: samples/WebAppWithAppSettings/appsettings.json
================================================
{
"PluginFramework": {
"Catalogs": [
{
"Type": "Folder",
"Path": "..\\Shared\\Weikio.PluginFramework.Samples.SharedPlugins\\bin\\debug\\netcoreapp3.1"
},
{
"Type": "Assembly",
"Path": ".\\bin\\Debug\\netcoreapp3.1\\WebAppPluginsLibrary.dll"
}
]
}
}
================================================
FILE: samples/WebAppWithDelegate/Controllers/DelegateController.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Weikio.PluginFramework.Abstractions;
namespace WebAppWithDelegate.Controllers
{
[ApiController]
[Route("[controller]")]
public class DelegateController : ControllerBase
{
private readonly IPluginCatalog _pluginCatalog;
private readonly IServiceProvider _sp;
public DelegateController(IPluginCatalog pluginCatalog, IServiceProvider serviceProvider)
{
_pluginCatalog = pluginCatalog;
_sp = serviceProvider;
}
[HttpGet]
public string Get()
{
var actionPlugin = _pluginCatalog.Get("MyActionPlugin", Version.Parse("1.0.0.0"));
var funcPlugin = _pluginCatalog.Get("MyFuncPlugin", Version.Parse("1.0.0.0"));
var funcExternalServicePlugin = _pluginCatalog.Get("MyExternalServicePlugin", Version.Parse("1.0.0.0"));
dynamic action = _sp.Create(actionPlugin);
dynamic func = _sp.Create(funcPlugin);
dynamic external = _sp.Create(funcExternalServicePlugin);
var s = new List<string>() { "Hello from controller" };
action.Run(s);
var result = func.Run(s);
// Conversion rules are used to convert the func's string parameter into a property and to convert the ExternalService into a constructor parameter.
external.S = result;
result = external.Run();
return result;
}
}
}
================================================
FILE: samples/WebAppWithDelegate/ExternalService.cs
================================================
namespace WebAppWithDelegate
{
public class ExternalService
{
public string GetWords()
{
return "Hello from external service";
}
}
}
================================================
FILE: samples/WebAppWithDelegate/Program.cs
================================================
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace WebAppWithDelegate
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
================================================
FILE: samples/WebAppWithDelegate/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Catalogs.Delegates;
namespace WebAppWithDelegate
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// 1. Create a Plugin Catalog from an Action
var actionDelegate = new Action<List<string>>(s =>
{
s.Add("Hello from action");
});
var actionCatalog = new DelegatePluginCatalog(actionDelegate, "MyActionPlugin");
// 2. Create an another catalog from a Func
var funcDelegate = new Func<List<string>, string>(s =>
{
s.Add("Hello from func");
return string.Join(Environment.NewLine, s);
});
var funcCatalog = new DelegatePluginCatalog(funcDelegate, "MyFuncPlugin");
// 3. Create a third catalog to show how constructor injection and parameters can be used
var funcWithExternalService = new Func<string, ExternalService, string>((s, service) =>
{
var words = service.GetWords();
s = s + Environment.NewLine + words;
return s;
});
var funcWithExternalServiceCatalog = new DelegatePluginCatalog(funcWithExternalService, pluginName: "MyExternalServicePlugin",
// 4. Use conversion rules to indicate that ExternalService should be a constructor parameter and the string should be a property
conversionRules: new List<DelegateConversionRule>()
{
// Rules can target parameter types
new DelegateConversionRule(info => info.ParameterType == typeof(ExternalService), nfo => new ParameterConversion() { ToConstructor = true }),
// Conversions based on the parameter names also work
new DelegateConversionRule(info => info.Name == "s", nfo => new ParameterConversion() { ToPublicProperty = true }),
});
services.AddPluginFramework()
.AddPluginCatalog(new CompositePluginCatalog(actionCatalog, funcCatalog, funcWithExternalServiceCatalog));
services.AddSingleton<ExternalService>();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
================================================
FILE: samples/WebAppWithDelegate/WebAppWithDelegate.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<Content Update="Properties\launchSettings.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project>
================================================
FILE: samples/WebAppWithDelegate/appsettings.Development.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
================================================
FILE: samples/WebAppWithDelegate/appsettings.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
================================================
FILE: samples/WebAppWithNuget/Controllers/CalculatorController.cs
================================================
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Samples.Shared;
namespace WebAppWithNuget.Controllers
{
[ApiController]
[Route("[controller]")]
public class CalculatorController : ControllerBase
{
private readonly IEnumerable<IOperator> _operators;
private readonly IEnumerable<Plugin> _plugins;
public CalculatorController(IEnumerable<IOperator> operators, IEnumerable<Plugin> plugins, IOperator myOperator)
{
_operators = operators;
_plugins = plugins;
}
[HttpGet]
public string Get()
{
var pluginsList = string.Join(", ", _plugins);
return pluginsList;
}
}
}
================================================
FILE: samples/WebAppWithNuget/NugetLogger.cs
================================================
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NuGet.Common;
using LogLevel = NuGet.Common.LogLevel;
namespace WebAppWithNuget
{
public class NugetLogger : LoggerBase
{
private readonly ILogger<NugetLogger> _logger;
public NugetLogger(IServiceCollection serviceCollection)
{
var provider = serviceCollection.BuildServiceProvider();
_logger = (ILogger<NugetLogger>) provider.GetService(typeof(ILogger<NugetLogger>));
}
public override void Log(ILogMessage message)
{
switch (message.Level)
{
case LogLevel.Debug:
_logger.LogDebug(message.ToString());
break;
case LogLevel.Verbose:
_logger.LogTrace(message.ToString());
break;
case LogLevel.Information:
_logger.LogInformation(message.ToString());
break;
case LogLevel.Minimal:
_logger.LogTrace(message.ToString());
break;
case LogLevel.Warning:
_logger.LogWarning(message.ToString());
break;
case LogLevel.Error:
_logger.LogError(message.ToString());
break;
}
}
public override Task LogAsync(ILogMessage message)
{
Log(message);
return Task.CompletedTask;
}
}
}
================================================
FILE: samples/WebAppWithNuget/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace WebAppWithNuget
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
================================================
FILE: samples/WebAppWithNuget/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Catalogs.NuGet;
using Weikio.PluginFramework.Samples.Shared;
namespace WebAppWithNuget
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
NugetPluginCatalogOptions.Defaults.LoggerFactory = () => new NugetLogger(services);
var options = new NugetPluginCatalogOptions
{
ForcePackageCaching = true,
CustomPackagesFolder = Path.Combine(Path.GetTempPath(), "NugetPackagePluginCatalog", "Sample")
};
var nugetCatalog = new NugetPackagePluginCatalog("Weikio.PluginFramework.Samples.SharedPlugins", includePrerelease: true, configureFinder: finder =>
{
finder.Implements<IOperator>();
}, options: options);
services.AddPluginFramework()
.AddPluginCatalog(nugetCatalog)
.AddPluginType<IOperator>();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
================================================
FILE: samples/WebAppWithNuget/WebAppWithNuget.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj" />
<ProjectReference Include="..\..\src\Weikio.PluginFramework.Catalogs.NuGet\Weikio.PluginFramework.Catalogs.NuGet.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
</Project>
================================================
FILE: samples/WebAppWithNuget/appsettings.Development.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
================================================
FILE: samples/WebAppWithNuget/appsettings.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
================================================
FILE: samples/WebAppWithRoslyn/Controllers/RoslynController.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Weikio.PluginFramework.Abstractions;
namespace WebAppWithRoslyn.Controllers
{
[ApiController]
[Route("[controller]")]
public class RoslynController : ControllerBase
{
private readonly IPluginCatalog _pluginCatalog;
private readonly IServiceProvider _sp;
public RoslynController(IPluginCatalog pluginCatalog, IServiceProvider sp)
{
_pluginCatalog = pluginCatalog;
_sp = sp;
}
[HttpGet]
public async Task<string> Get()
{
var scriptPlugin = _pluginCatalog.GetPlugins().First();
dynamic scriptInstance = Activator.CreateInstance(scriptPlugin);
var scriptResult = await scriptInstance.Run();
var typePlugin = _pluginCatalog.Get("MyPlugin", Version.Parse("1.5.0.0"));
dynamic typeInstance = typePlugin.Create(_sp);
var typeResult = typeInstance.RunThings();
var result = new StringBuilder();
result.AppendLine(scriptResult);
result.AppendLine(typeResult);
return result.ToString();
}
}
}
================================================
FILE: samples/WebAppWithRoslyn/ExternalService.cs
================================================
namespace WebAppWithRoslyn
{
public class ExternalService
{
public string DoWork()
{
return "External service did some work";
}
}
}
================================================
FILE: samples/WebAppWithRoslyn/Program.cs
================================================
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace WebAppWithRoslyn
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
================================================
FILE: samples/WebAppWithRoslyn/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Catalogs.Roslyn;
namespace WebAppWithRoslyn
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// First we create a Roslyn Plugin Catalog which uses the scripting version of C#/Roslyn
var script = "var x = \"Hello from Roslyn Plugin\"; return x;";
var roslynScriptCatalog = new RoslynPluginCatalog(script);
// We also create an another Roslyn Plugin Catalog to show how to create a plugin from a class.
// This catalog also uses dependency injection, external references and additional namespaces.
var code = @"public class MyClass
{
private ExternalService _service;
public MyClass(ExternalService service)
{
_service = service;
}
public string RunThings()
{
var result = JsonConvert.SerializeObject(15);
result += _service.DoWork();
return result;
}
}";
var options = new RoslynPluginCatalogOptions()
{
PluginName = "MyPlugin",
PluginVersion = new Version("1.5.0.0"),
AdditionalReferences = new List<Assembly>() { typeof(Newtonsoft.Json.JsonConvert).Assembly, typeof(ExternalService).Assembly },
AdditionalNamespaces = new List<string>() { "Newtonsoft.Json", "WebAppWithRoslyn" }
};
var roslynCodeCatalog = new RoslynPluginCatalog(code, options);
services.AddPluginFramework()
.AddPluginCatalog(new CompositePluginCatalog(roslynScriptCatalog, roslynCodeCatalog));
services.AddSingleton<ExternalService>();
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
================================================
FILE: samples/WebAppWithRoslyn/WebAppWithRoslyn.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj" />
<ProjectReference Include="..\..\src\Weikio.PluginFramework.Catalogs.Roslyn\Weikio.PluginFramework.Catalogs.Roslyn.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<Content Update="Properties\launchSettings.json">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
</Project>
================================================
FILE: samples/WebAppWithRoslyn/appsettings.Development.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
================================================
FILE: samples/WebAppWithRoslyn/appsettings.json
================================================
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
================================================
FILE: samples/WinFormsApp/DivideOperator.cs
================================================
using Weikio.PluginFramework.Samples.Shared;
namespace WinFormsApp
{
public class DivideOperator : IOperator
{
public int Calculate(int x, int y)
{
return x / y;
}
}
}
================================================
FILE: samples/WinFormsApp/Form1.Designer.cs
================================================
namespace WinFormsApp
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.dialogPluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(12, 123);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(438, 277);
this.listBox1.TabIndex = 0;
//
// button1
//
this.button1.Location = new System.Drawing.Point(12, 414);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(102, 24);
this.button1.TabIndex = 1;
this.button1.Text = "Run Plugin";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(120, 414);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(330, 24);
this.textBox1.TabIndex = 2;
//
// label1
//
this.label1.Location = new System.Drawing.Point(12, 101);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(98, 19);
this.label1.TabIndex = 3;
this.label1.Text = "Plugins:";
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.dialogPluginsToolStripMenuItem });
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(462, 24);
this.menuStrip1.TabIndex = 4;
this.menuStrip1.Text = "menuStrip1";
//
// dialogPluginsToolStripMenuItem
//
this.dialogPluginsToolStripMenuItem.Name = "dialogPluginsToolStripMenuItem";
this.dialogPluginsToolStripMenuItem.Size = new System.Drawing.Size(104, 20);
this.dialogPluginsToolStripMenuItem.Text = "Dialog Plugins...";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(462, 450);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.menuStrip1);
this.MainMenuStrip = this.menuStrip1;
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.ToolStripMenuItem dialogPluginsToolStripMenuItem;
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.TextBox textBox1;
#endregion
}
}
================================================
FILE: samples/WinFormsApp/Form1.cs
================================================
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Catalogs.Delegates;
using Weikio.PluginFramework.Samples.Shared;
using Weikio.PluginFramework.TypeFinding;
namespace WinFormsApp
{
public partial class Form1 : Form
{
private CompositePluginCatalog _allPlugins = new CompositePluginCatalog();
public Form1()
{
InitializeComponent();
}
private async void Form1_Load(object sender, EventArgs e)
{
// Demonstrates how tags can be used with Plugin Framework.
// Single _allPlugins catalog is created from multiple different catalogs. All the plugins are tagged.
await CreateCatalogs();
// 1. Adds calculation operators using tag 'operator'
AddCalculationOperators();
// 2. Adds dialogs using 'dialog' tag
AddDialogs();
// 3. Adds buttons using 'button' tag
AddButtons();
}
private async Task CreateCatalogs()
{
// 1. Uses folder catalog to add calculation operations inside the app. Mimics the WPF-sample.
var folderPluginCatalog = new FolderPluginCatalog(@"..\..\..\..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1",
type => { type.Implements<IOperator>().Tag("operator"); });
_allPlugins.AddCatalog(folderPluginCatalog);
var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(Form1).Assembly, builder =>
{
builder.Implements<IOperator>()
.Tag("operator");
});
_allPlugins.AddCatalog(assemblyPluginCatalog);
// 2. Another folder catalog is used to add other forms inside the app. For each form a button is added into the toolstrip
// Note: WinFormsPluginsLibrary must be manually built as it isn't referenced by this sample app
var folderCatalog = new FolderPluginCatalog(@"..\..\..\..\WinFormsPluginsLibrary\bin\debug\netcoreapp3.1",
type =>
{
type.Implements<IDialog>()
.Tag("dialog");
});
_allPlugins.AddCatalog(folderCatalog);
// 3. Lastly, DelegateCatalog is used for creating an exit-button
var exitAction = new Action(() =>
{
var result = MessageBox.Show("This is also a plugin. Do you want to exit this sample app?", "Exit App?", MessageBoxButtons.YesNo);
if (result == DialogResult.No)
{
return;
}
Application.Exit();
});
var exitCatalog = new DelegatePluginCatalog(exitAction, options: new DelegatePluginCatalogOptions(){Tags = new List<string> { "buttons" }} , pluginName: "Exit" );
_allPlugins.AddCatalog(exitCatalog);
// Finally the plugin catalog is initialized
await _allPlugins.Initialize();
}
private void AddCalculationOperators()
{
var allPlugins = _allPlugins.GetByTag("operator");
foreach (var plugin in allPlugins)
{
listBox1.Items.Add(plugin);
}
}
private void AddDialogs()
{
var dialogPlugins = _allPlugins.GetByTag("dialog");
foreach (var dialogPlugin in dialogPlugins)
{
var menuItem = new ToolStripButton(dialogPlugin.Name, null, (o, args) =>
{
var instance = (IDialog) Activator.CreateInstance(dialogPlugin);
instance.Show();
});
dialogPluginsToolStripMenuItem.DropDownItems.Add(menuItem);
}
}
private void AddButtons()
{
var buttonPlugins = _allPlugins.GetByTag("buttons");
foreach (var buttonPlugin in buttonPlugins)
{
menuStrip1.Items.Add(new ToolStripButton(buttonPlugin.Name, null, (sender, args) =>
{
dynamic instance = Activator.CreateInstance(buttonPlugin);
instance.Run();
}));
}
}
private void button1_Click(object sender, EventArgs e)
{
var selectedPlugin = listBox1.SelectedItem as Plugin;
if (selectedPlugin == null)
{
return;
}
var instance = (IOperator) Activator.CreateInstance(selectedPlugin);
var result = instance.Calculate(20, 10);
textBox1.Text = result.ToString();
}
}
}
================================================
FILE: samples/WinFormsApp/Form1.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
================================================
FILE: samples/WinFormsApp/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using Weikio.PluginFramework.Context;
namespace WinFormsApp
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
================================================
FILE: samples/WinFormsApp/WinFormsApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework\Weikio.PluginFramework.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
</Project>
================================================
FILE: samples/WinFormsPluginsLibrary/LabelPlugin.Designer.cs
================================================
using System.ComponentModel;
using System.Drawing;
namespace WinFormsPluginsLibrary
{
partial class LabelPlugin
{
/// <summary>
/// Required designer variable.
/// </summary>
private IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(105, 12);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(110, 50);
this.button1.TabIndex = 0;
this.button1.Text = "Update Label";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.Location = new System.Drawing.Point(90, 88);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(125, 36);
this.label1.TabIndex = 1;
//
// LabelPlugin
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(313, 184);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Name = "LabelPlugin";
this.Text = "LabelPlugin";
this.ResumeLayout(false);
}
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
#endregion
}
}
================================================
FILE: samples/WinFormsPluginsLibrary/LabelPlugin.cs
================================================
using System;
using System.ComponentModel;
using System.Windows.Forms;
using Weikio.PluginFramework.Samples.Shared;
namespace WinFormsPluginsLibrary
{
public partial class LabelPlugin : Form, IDialog
{
public LabelPlugin()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Another simple example";
}
}
}
================================================
FILE: samples/WinFormsPluginsLibrary/LabelPlugin.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
================================================
FILE: samples/WinFormsPluginsLibrary/TestPlugin.Designer.cs
================================================
using System.ComponentModel;
namespace WinFormsPluginsLibrary
{
partial class TestPlugin
{
/// <summary>
/// Required designer variable.
/// </summary>
private IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(118, 86);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(202, 42);
this.button1.TabIndex = 0;
this.button1.Text = "Say Hello";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// TestPlugin
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(433, 233);
this.Controls.Add(this.button1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "TestPlugin";
this.Text = "TestPlugin";
this.ResumeLayout(false);
}
private System.Windows.Forms.Button button1;
#endregion
}
}
================================================
FILE: samples/WinFormsPluginsLibrary/TestPlugin.cs
================================================
using System;
using System.ComponentModel;
using System.Windows.Forms;
using Weikio.PluginFramework.Samples.Shared;
namespace WinFormsPluginsLibrary
{
[DisplayName("Hello World")]
public partial class TestPlugin : Form, IDialog
{
public TestPlugin()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello Plugin Framework");
}
}
}
================================================
FILE: samples/WinFormsPluginsLibrary/TestPlugin.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
================================================
FILE: samples/WinFormsPluginsLibrary/WinFormsPluginsLibrary.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
<ItemGroup>
<Compile Update="TestPlugin.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="LabelPlugin.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
</Project>
================================================
FILE: samples/WpfApp/App.xaml
================================================
<Application x:Class="WpfApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
================================================
FILE: samples/WpfApp/App.xaml.cs
================================================
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}
================================================
FILE: samples/WpfApp/AssemblyInfo.cs
================================================
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
================================================
FILE: samples/WpfApp/DivideOperator.cs
================================================
using Weikio.PluginFramework.Samples.Shared;
namespace WpfApp
{
public class DivideOperator : IOperator
{
public int Calculate(int x, int y)
{
return x / y;
}
}
}
================================================
FILE: samples/WpfApp/MainWindow.xaml
================================================
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="MainWindow_OnLoaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBlock Text="Plugins:" />
<ListBox x:Name="PluginsList" Grid.Row="1" />
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Run Plugin" Click="ButtonBase_OnClick" />
<TextBlock x:Name="PluginOutput" Grid.Column="1" />
</Grid>
</Grid>
</Window>
================================================
FILE: samples/WpfApp/MainWindow.xaml.cs
================================================
using System;
using System.Collections.ObjectModel;
using System.Windows;
using Weikio.PluginFramework.Samples.Shared;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs;
namespace WpfApp
{
public partial class MainWindow : Window
{
private readonly ObservableCollection<Plugin> _plugins = new ObservableCollection<Plugin>();
public MainWindow()
{
InitializeComponent();
}
private async void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
var folderPluginCatalog = new FolderPluginCatalog(@"..\..\..\..\Shared\Weikio.PluginFramework.Samples.SharedPlugins\bin\debug\netcoreapp3.1", type =>
{
type.Implements<IOperator>();
});
var assemblyPluginCatalog = new AssemblyPluginCatalog(typeof(MainWindow).Assembly, type => typeof(IOperator).IsAssignableFrom(type));
var pluginCatalog = new CompositePluginCatalog(folderPluginCatalog, assemblyPluginCatalog);
await pluginCatalog.Initialize();
var allPlugins = pluginCatalog.GetPlugins();
foreach (var plugin in allPlugins)
{
_plugins.Add(plugin);
}
PluginsList.ItemsSource = _plugins;
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
if (PluginsList.SelectedItem == null)
{
return;
}
var selectedPlugin = (Plugin) PluginsList.SelectedItem;
var instance = (IOperator) Activator.CreateInstance(selectedPlugin);
var result = instance.Calculate(20, 10);
PluginOutput.Text = result.ToString();
}
}
}
================================================
FILE: samples/WpfApp/WpfApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Weikio.PluginFramework.Abstractions\Weikio.PluginFramework.Abstractions.csproj" />
<ProjectReference Include="..\..\src\Weikio.PluginFramework\Weikio.PluginFramework.csproj" />
<ProjectReference Include="..\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj" />
</ItemGroup>
</Project>
================================================
FILE: src/PluginFramework.sln
================================================
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30330.147
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework", "Weikio.PluginFramework\Weikio.PluginFramework.csproj", "{BB67695B-1CDF-4FEC-8627-82FD349D1403}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Abstractions", "Weikio.PluginFramework.Abstractions\Weikio.PluginFramework.Abstractions.csproj", "{5C264288-C384-48A3-AF94-850D98830E13}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Tests", "..\tests\unit\Weikio.PluginFramework.Tests\Weikio.PluginFramework.Tests.csproj", "{6CDBFF3C-932B-4A66-8779-B5C72B33AF7F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{DE041517-4760-4748-97F6-DB71D6AFFF5B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestAssembly1", "..\tests\Assemblies\TestAssembly1\TestAssembly1.csproj", "{DB21DEFB-37D4-4006-A6B9-735671151D29}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestAssembly2", "..\tests\Assemblies\TestAssembly2\TestAssembly2.csproj", "{F2987B1B-2FBD-4F1A-B95D-7F14618B2971}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestAssembly3", "..\tests\Assemblies\TestAssembly3\TestAssembly3.csproj", "{BB7D0751-895E-4820-9F52-CE4ECEE0F1FD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestIntefaces", "..\tests\Assemblies\TestIntefaces\TestIntefaces.csproj", "{044D3F05-A2F2-4D4A-A3FE-360F57BB765D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonNetOld", "..\tests\Assemblies\JsonNetOld\JsonNetOld.csproj", "{8653C860-AF1B-42E6-8DAD-AEBC08D676B2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonNetNew", "..\tests\Assemblies\JsonNetNew\JsonNetNew.csproj", "{6FB33F21-3C1B-4BB0-AFC6-E512EE9F5928}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Resources", "Resources", "{B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{FF3A507D-D242-44F6-8940-49E0B51B6F02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "..\samples\ConsoleApp\ConsoleApp.csproj", "{C161BE3A-99A1-4A89-A2CE-79A5A1994FFC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Samples.Shared", "..\samples\Shared\Weikio.PluginFramework.Samples.Shared\Weikio.PluginFramework.Samples.Shared.csproj", "{DBC0AD60-7261-4CEB-BE4F-3AD12C39F813}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfApp", "..\samples\WpfApp\WpfApp.csproj", "{91A58039-85B5-4B2C-8F25-10DD6033F3AA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Samples.SharedPlugins", "..\samples\Shared\Weikio.PluginFramework.Samples.SharedPlugins\Weikio.PluginFramework.Samples.SharedPlugins.csproj", "{6E19B5B2-9106-4EB3-8B0E-1C735FB4C815}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp", "..\samples\WebApp\WebApp.csproj", "{30C02979-E0C0-4AD0-B88F-23EF28807473}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.AspNetCore", "Weikio.PluginFramework.AspNetCore\Weikio.PluginFramework.AspNetCore.csproj", "{E4F3E21D-653A-4AE7-B1DA-63B3F041367C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{E24D3F2A-4080-475B-92D3-C80B9BD20A70}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Catalogs.NuGet", "Weikio.PluginFramework.Catalogs.NuGet\Weikio.PluginFramework.Catalogs.NuGet.csproj", "{4BCDAB59-F231-4241-B6BE-93BDC047C86F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Catalogs.Roslyn", "Weikio.PluginFramework.Catalogs.Roslyn\Weikio.PluginFramework.Catalogs.Roslyn.csproj", "{74D03415-F262-4DA2-B319-6A88F3278CC7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Catalogs.Roslyn.Tests", "..\tests\unit\Weikio.PluginFramework.Catalogs.Roslyn.Tests\Weikio.PluginFramework.Catalogs.Roslyn.Tests.csproj", "{E7600CAB-94DC-4A17-ABB2-B789A6409E02}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Weikio.PluginFramework.Catalogs.NuGet.Tests", "..\tests\integration\Weikio.PluginFramework.Catalogs.NuGet.Tests\Weikio.PluginFramework.Catalogs.NuGet.Tests.csproj", "{174C5479-712A-46DB-BD91-C031F6B3A55D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebAppWithNuget", "..\samples\WebAppWithNuget\WebAppWithNuget.csproj", "{0FFD32D3-3A4F-453E-B7A2-8891F77F03D0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebAppWithRoslyn", "..\samples\WebAppWithRoslyn\WebAppWithRoslyn.csproj", "{9C46DA92-CB56-45FA-A904-0A7330C71C2C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebAppWithDelegate", "..\samples\WebAppWithDelegate\WebAppWithDelegate.csproj", "{C2DD5D1C-2F8A-4EC9-BE90-66418A8602AE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorApp", "..\Samples\BlazorApp\BlazorApp.csproj", "{A7EC9D91-CED0-43E7-BAB3-3B72230BFC0B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsApp", "..\samples\WinFormsApp\WinFormsApp.csproj", "{6D392453-FC9E-45AD-A9A7-7596A93B3E6C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsPluginsLibrary", "..\samples\WinFormsPluginsLibrary\WinFormsPluginsLibrary.csproj", "{E92B0C5D-FFAC-4AB9-B069-869AEED565B0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Weikio.PluginFramework.Configuration", "Weikio.PluginFramework.Configuration\Weikio.PluginFramework.Configuration.csproj", "{882BB58E-D256-4BBF-8C5F-80C4FA39B775}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAppWithAppSettings", "..\samples\WebAppWithAppSettings\WebAppWithAppSettings.csproj", "{A5FAE1A5-74A0-4A83-9520-DCABF6610ADE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAppPluginsLibrary", "..\samples\WebAppPluginsLibrary\WebAppPluginsLibrary.csproj", "{38CCE0F7-F998-4766-A14A-44C047E8D0AA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebSites", "WebSites", "{38E778EC-D2F9-46E8-9D48-9405B1D05BDC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginFrameworkTestBed", "..\tests\integration\WebSites\PluginFrameworkTestBed\PluginFrameworkTestBed.csproj", "{1F634A43-B7E4-4C8A-9877-AE6A03E9ACB5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Weikio.PluginFramework.AspNetCore.IntegrationTests", "..\tests\integration\Weikio.PluginFramework.AspNetCore.IntegrationTests\Weikio.PluginFramework.AspNetCore.IntegrationTests.csproj", "{7AA40D04-0826-4F4A-9028-2270BAED0B9B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BB67695B-1CDF-4FEC-8627-82FD349D1403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB67695B-1CDF-4FEC-8627-82FD349D1403}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB67695B-1CDF-4FEC-8627-82FD349D1403}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB67695B-1CDF-4FEC-8627-82FD349D1403}.Release|Any CPU.Build.0 = Release|Any CPU
{5C264288-C384-48A3-AF94-850D98830E13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5C264288-C384-48A3-AF94-850D98830E13}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5C264288-C384-48A3-AF94-850D98830E13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5C264288-C384-48A3-AF94-850D98830E13}.Release|Any CPU.Build.0 = Release|Any CPU
{6CDBFF3C-932B-4A66-8779-B5C72B33AF7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6CDBFF3C-932B-4A66-8779-B5C72B33AF7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6CDBFF3C-932B-4A66-8779-B5C72B33AF7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6CDBFF3C-932B-4A66-8779-B5C72B33AF7F}.Release|Any CPU.Build.0 = Release|Any CPU
{DB21DEFB-37D4-4006-A6B9-735671151D29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DB21DEFB-37D4-4006-A6B9-735671151D29}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DB21DEFB-37D4-4006-A6B9-735671151D29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DB21DEFB-37D4-4006-A6B9-735671151D29}.Release|Any CPU.Build.0 = Release|Any CPU
{F2987B1B-2FBD-4F1A-B95D-7F14618B2971}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F2987B1B-2FBD-4F1A-B95D-7F14618B2971}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F2987B1B-2FBD-4F1A-B95D-7F14618B2971}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F2987B1B-2FBD-4F1A-B95D-7F14618B2971}.Release|Any CPU.Build.0 = Release|Any CPU
{BB7D0751-895E-4820-9F52-CE4ECEE0F1FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB7D0751-895E-4820-9F52-CE4ECEE0F1FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB7D0751-895E-4820-9F52-CE4ECEE0F1FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB7D0751-895E-4820-9F52-CE4ECEE0F1FD}.Release|Any CPU.Build.0 = Release|Any CPU
{044D3F05-A2F2-4D4A-A3FE-360F57BB765D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{044D3F05-A2F2-4D4A-A3FE-360F57BB765D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{044D3F05-A2F2-4D4A-A3FE-360F57BB765D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{044D3F05-A2F2-4D4A-A3FE-360F57BB765D}.Release|Any CPU.Build.0 = Release|Any CPU
{8653C860-AF1B-42E6-8DAD-AEBC08D676B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8653C860-AF1B-42E6-8DAD-AEBC08D676B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8653C860-AF1B-42E6-8DAD-AEBC08D676B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8653C860-AF1B-42E6-8DAD-AEBC08D676B2}.Release|Any CPU.Build.0 = Release|Any CPU
{6FB33F21-3C1B-4BB0-AFC6-E512EE9F5928}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FB33F21-3C1B-4BB0-AFC6-E512EE9F5928}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FB33F21-3C1B-4BB0-AFC6-E512EE9F5928}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FB33F21-3C1B-4BB0-AFC6-E512EE9F5928}.Release|Any CPU.Build.0 = Release|Any CPU
{C161BE3A-99A1-4A89-A2CE-79A5A1994FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C161BE3A-99A1-4A89-A2CE-79A5A1994FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C161BE3A-99A1-4A89-A2CE-79A5A1994FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C161BE3A-99A1-4A89-A2CE-79A5A1994FFC}.Release|Any CPU.Build.0 = Release|Any CPU
{DBC0AD60-7261-4CEB-BE4F-3AD12C39F813}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DBC0AD60-7261-4CEB-BE4F-3AD12C39F813}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DBC0AD60-7261-4CEB-BE4F-3AD12C39F813}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DBC0AD60-7261-4CEB-BE4F-3AD12C39F813}.Release|Any CPU.Build.0 = Release|Any CPU
{91A58039-85B5-4B2C-8F25-10DD6033F3AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91A58039-85B5-4B2C-8F25-10DD6033F3AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91A58039-85B5-4B2C-8F25-10DD6033F3AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91A58039-85B5-4B2C-8F25-10DD6033F3AA}.Release|Any CPU.Build.0 = Release|Any CPU
{6E19B5B2-9106-4EB3-8B0E-1C735FB4C815}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E19B5B2-9106-4EB3-8B0E-1C735FB4C815}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6E19B5B2-9106-4EB3-8B0E-1C735FB4C815}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E19B5B2-9106-4EB3-8B0E-1C735FB4C815}.Release|Any CPU.Build.0 = Release|Any CPU
{30C02979-E0C0-4AD0-B88F-23EF28807473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{30C02979-E0C0-4AD0-B88F-23EF28807473}.Debug|Any CPU.Build.0 = Debug|Any CPU
{30C02979-E0C0-4AD0-B88F-23EF28807473}.Release|Any CPU.ActiveCfg = Release|Any CPU
{30C02979-E0C0-4AD0-B88F-23EF28807473}.Release|Any CPU.Build.0 = Release|Any CPU
{E4F3E21D-653A-4AE7-B1DA-63B3F041367C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4F3E21D-653A-4AE7-B1DA-63B3F041367C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E4F3E21D-653A-4AE7-B1DA-63B3F041367C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E4F3E21D-653A-4AE7-B1DA-63B3F041367C}.Release|Any CPU.Build.0 = Release|Any CPU
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4BCDAB59-F231-4241-B6BE-93BDC047C86F}.Release|Any CPU.Build.0 = Release|Any CPU
{74D03415-F262-4DA2-B319-6A88F3278CC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74D03415-F262-4DA2-B319-6A88F3278CC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74D03415-F262-4DA2-B319-6A88F3278CC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74D03415-F262-4DA2-B319-6A88F3278CC7}.Release|Any CPU.Build.0 = Release|Any CPU
{E7600CAB-94DC-4A17-ABB2-B789A6409E02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7600CAB-94DC-4A17-ABB2-B789A6409E02}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7600CAB-94DC-4A17-ABB2-B789A6409E02}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7600CAB-94DC-4A17-ABB2-B789A6409E02}.Release|Any CPU.Build.0 = Release|Any CPU
{174C5479-712A-46DB-BD91-C031F6B3A55D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{174C5479-712A-46DB-BD91-C031F6B3A55D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{174C5479-712A-46DB-BD91-C031F6B3A55D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{174C5479-712A-46DB-BD91-C031F6B3A55D}.Release|Any CPU.Build.0 = Release|Any CPU
{0FFD32D3-3A4F-453E-B7A2-8891F77F03D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0FFD32D3-3A4F-453E-B7A2-8891F77F03D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0FFD32D3-3A4F-453E-B7A2-8891F77F03D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0FFD32D3-3A4F-453E-B7A2-8891F77F03D0}.Release|Any CPU.Build.0 = Release|Any CPU
{9C46DA92-CB56-45FA-A904-0A7330C71C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C46DA92-CB56-45FA-A904-0A7330C71C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C46DA92-CB56-45FA-A904-0A7330C71C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C46DA92-CB56-45FA-A904-0A7330C71C2C}.Release|Any CPU.Build.0 = Release|Any CPU
{C2DD5D1C-2F8A-4EC9-BE90-66418A8602AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C2DD5D1C-2F8A-4EC9-BE90-66418A8602AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2DD5D1C-2F8A-4EC9-BE90-66418A8602AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2DD5D1C-2F8A-4EC9-BE90-66418A8602AE}.Release|Any CPU.Build.0 = Release|Any CPU
{A7EC9D91-CED0-43E7-BAB3-3B72230BFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A7EC9D91-CED0-43E7-BAB3-3B72230BFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A7EC9D91-CED0-43E7-BAB3-3B72230BFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A7EC9D91-CED0-43E7-BAB3-3B72230BFC0B}.Release|Any CPU.Build.0 = Release|Any CPU
{6D392453-FC9E-45AD-A9A7-7596A93B3E6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D392453-FC9E-45AD-A9A7-7596A93B3E6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D392453-FC9E-45AD-A9A7-7596A93B3E6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D392453-FC9E-45AD-A9A7-7596A93B3E6C}.Release|Any CPU.Build.0 = Release|Any CPU
{E92B0C5D-FFAC-4AB9-B069-869AEED565B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E92B0C5D-FFAC-4AB9-B069-869AEED565B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E92B0C5D-FFAC-4AB9-B069-869AEED565B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E92B0C5D-FFAC-4AB9-B069-869AEED565B0}.Release|Any CPU.Build.0 = Release|Any CPU
{882BB58E-D256-4BBF-8C5F-80C4FA39B775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{882BB58E-D256-4BBF-8C5F-80C4FA39B775}.Debug|Any CPU.Build.0 = Debug|Any CPU
{882BB58E-D256-4BBF-8C5F-80C4FA39B775}.Release|Any CPU.ActiveCfg = Release|Any CPU
{882BB58E-D256-4BBF-8C5F-80C4FA39B775}.Release|Any CPU.Build.0 = Release|Any CPU
{A5FAE1A5-74A0-4A83-9520-DCABF6610ADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A5FAE1A5-74A0-4A83-9520-DCABF6610ADE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A5FAE1A5-74A0-4A83-9520-DCABF6610ADE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A5FAE1A5-74A0-4A83-9520-DCABF6610ADE}.Release|Any CPU.Build.0 = Release|Any CPU
{38CCE0F7-F998-4766-A14A-44C047E8D0AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{38CCE0F7-F998-4766-A14A-44C047E8D0AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38CCE0F7-F998-4766-A14A-44C047E8D0AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{38CCE0F7-F998-4766-A14A-44C047E8D0AA}.Release|Any CPU.Build.0 = Release|Any CPU
{1F634A43-B7E4-4C8A-9877-AE6A03E9ACB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F634A43-B7E4-4C8A-9877-AE6A03E9ACB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F634A43-B7E4-4C8A-9877-AE6A03E9ACB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F634A43-B7E4-4C8A-9877-AE6A03E9ACB5}.Release|Any CPU.Build.0 = Release|Any CPU
{7AA40D04-0826-4F4A-9028-2270BAED0B9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7AA40D04-0826-4F4A-9028-2270BAED0B9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7AA40D04-0826-4F4A-9028-2270BAED0B9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7AA40D04-0826-4F4A-9028-2270BAED0B9B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{6CDBFF3C-932B-4A66-8779-B5C72B33AF7F} = {DE041517-4760-4748-97F6-DB71D6AFFF5B}
{DB21DEFB-37D4-4006-A6B9-735671151D29} = {B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}
{F2987B1B-2FBD-4F1A-B95D-7F14618B2971} = {B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}
{BB7D0751-895E-4820-9F52-CE4ECEE0F1FD} = {B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}
{044D3F05-A2F2-4D4A-A3FE-360F57BB765D} = {B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}
{8653C860-AF1B-42E6-8DAD-AEBC08D676B2} = {B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}
{6FB33F21-3C1B-4BB0-AFC6-E512EE9F5928} = {B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A}
{B2BA1C10-1130-45ED-83F1-32BF8FBF4D4A} = {DE041517-4760-4748-97F6-DB71D6AFFF5B}
{C161BE3A-99A1-4A89-A2CE-79A5A1994FFC} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{DBC0AD60-7261-4CEB-BE4F-3AD12C39F813} = {E24D3F2A-4080-475B-92D3-C80B9BD20A70}
{91A58039-85B5-4B2C-8F25-10DD6033F3AA} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{6E19B5B2-9106-4EB3-8B0E-1C735FB4C815} = {E24D3F2A-4080-475B-92D3-C80B9BD20A70}
{30C02979-E0C0-4AD0-B88F-23EF28807473} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{E24D3F2A-4080-475B-92D3-C80B9BD20A70} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{E7600CAB-94DC-4A17-ABB2-B789A6409E02} = {DE041517-4760-4748-97F6-DB71D6AFFF5B}
{174C5479-712A-46DB-BD91-C031F6B3A55D} = {DE041517-4760-4748-97F6-DB71D6AFFF5B}
{0FFD32D3-3A4F-453E-B7A2-8891F77F03D0} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{9C46DA92-CB56-45FA-A904-0A7330C71C2C} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{C2DD5D1C-2F8A-4EC9-BE90-66418A8602AE} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{A7EC9D91-CED0-43E7-BAB3-3B72230BFC0B} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{6D392453-FC9E-45AD-A9A7-7596A93B3E6C} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{E92B0C5D-FFAC-4AB9-B069-869AEED565B0} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{A5FAE1A5-74A0-4A83-9520-DCABF6610ADE} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{38CCE0F7-F998-4766-A14A-44C047E8D0AA} = {FF3A507D-D242-44F6-8940-49E0B51B6F02}
{38E778EC-D2F9-46E8-9D48-9405B1D05BDC} = {DE041517-4760-4748-97F6-DB71D6AFFF5B}
{1F634A43-B7E4-4C8A-9877-AE6A03E9ACB5} = {38E778EC-D2F9-46E8-9D48-9405B1D05BDC}
{7AA40D04-0826-4F4A-9028-2270BAED0B9B} = {DE041517-4760-4748-97F6-DB71D6AFFF5B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AAEBC2B4-FB52-4272-8C25-571FB3CA01E5}
EndGlobalSection
EndGlobal
================================================
FILE: src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalog.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Context;
using Weikio.PluginFramework.TypeFinding;
namespace Weikio.PluginFramework.Catalogs
{
public class AssemblyPluginCatalog : IPluginCatalog
{
private readonly string _assemblyPath;
private Assembly _assembly;
private readonly AssemblyPluginCatalogOptions _options;
private PluginAssemblyLoadContext _pluginAssemblyLoadContext;
private List<TypePluginCatalog> _plugins = null;
public AssemblyPluginCatalog(string assemblyPath) : this(assemblyPath, null, null, null)
{
}
public AssemblyPluginCatalog(Assembly assembly) : this(null, assembly)
{
}
public AssemblyPluginCatalog(string assemblyPath, AssemblyPluginCatalogOptions options = null) : this(assemblyPath, null, null, null, null, null,
options)
{
}
public AssemblyPluginCatalog(Assembly assembly, AssemblyPluginCatalogOptions options = null) : this(null, assembly, null, null, null, null, options)
{
}
public AssemblyPluginCatalog(string assemblyPath, TypeFinderCriteria criteria = null, AssemblyPluginCatalogOptions options = null) : this(assemblyPath,
null, null, null,
null, criteria, options)
{
}
public AssemblyPluginCatalog(string assemblyPath, Action<TypeFinderCriteriaBuilder> configureFinder = null,
AssemblyPluginCatalogOptions options = null) : this(assemblyPath,
null, null, null, configureFinder, null, options)
{
}
public AssemblyPluginCatalog(Assembly assembly, Action<TypeFinderCriteriaBuilder> configureFinder = null,
AssemblyPluginCatalogOptions options = null) : this(null,
assembly, null, null, configureFinder, null, options)
{
}
public AssemblyPluginCatalog(string assemblyPath, Predicate<Type> filter = null, AssemblyPluginCatalogOptions options = null) : this(assemblyPath, null,
filter, null, null, null, options)
{
}
public AssemblyPluginCatalog(Assembly assembly, Predicate<Type> filter = null, AssemblyPluginCatalogOptions options = null) : this(null, assembly,
filter, null, null, null, options)
{
}
public AssemblyPluginCatalog(string assemblyPath, Dictionary<string, Predicate<Type>> taggedFilters,
AssemblyPluginCatalogOptions options = null) : this(assemblyPath, null, null, taggedFilters, null, null, options)
{
}
public AssemblyPluginCatalog(Assembly assembly, Dictionary<string, Predicate<Type>> taggedFilters,
AssemblyPluginCatalogOptions options = null) : this(null, assembly, null, taggedFilters, null, null, options)
{
}
public AssemblyPluginCatalog(string assemblyPath = null, Assembly assembly = null, Predicate<Type> filter = null,
Dictionary<string, Predicate<Type>> taggedFilters = null, Action<TypeFinderCriteriaBuilder> configureFinder = null,
TypeFinderCriteria criteria = null, AssemblyPluginCatalogOptions options = null)
{
if (assembly != null)
{
_assembly = assembly;
_assemblyPath = _assembly.Location;
}
else if (!string.IsNullOrWhiteSpace(assemblyPath))
{
_assemblyPath = assemblyPath;
}
else
{
throw new ArgumentNullException($"{nameof(assembly)} or {nameof(assemblyPath)} must be set.");
}
_options = options ?? new AssemblyPluginCatalogOptions();
SetFilters(filter, taggedFilters, criteria, configureFinder);
}
private void SetFilters(Predicate<Type> filter, Dictionary<string, Predicate<Type>> taggedFilters, TypeFinderCriteria criteria,
Action<TypeFinderCriteriaBuilder> configureFinder)
{
if (_options.TypeFinderOptions == null)
{
_options.TypeFinderOptions = new TypeFinderOptions();
}
if (_options.TypeFinderOptions.TypeFinderCriterias == null)
{
_options.TypeFinderOptions.TypeFinderCriterias = new List<TypeFinderCriteria>();
}
if (filter != null)
{
var filterCriteria = new TypeFinderCriteria { Query = (context, type) => filter(type) };
filterCriteria.Tags.Add(string.Empty);
_options.TypeFinderOptions.TypeFinderCriterias.Add(filterCriteria);
}
if (taggedFilters?.Any() == true)
{
foreach (var taggedFilter in taggedFilters)
{
var taggedCriteria = new TypeFinderCriteria { Query = (context, type) => taggedFilter.Value(type) };
taggedCriteria.Tags.Add(taggedFilter.Key);
_options.TypeFinderOptions.TypeFinderCriterias.Add(taggedCriteria);
}
}
if (configureFinder != null)
{
var builder = new TypeFinderCriteriaBuilder();
configureFinder(builder);
var configuredCriteria = builder.Build();
_options.TypeFinderOptions.TypeFinderCriterias.Add(configuredCriteria);
}
if (criteria != null)
{
_options.TypeFinderOptions.TypeFinderCriterias.Add(criteria);
}
if (_options.TypeFinderCriterias?.Any() == true)
{
foreach (var typeFinderCriteria in _options.TypeFinderCriterias)
{
var crit = typeFinderCriteria.Value;
crit.Tags = new List<string>() { typeFinderCriteria.Key };
_options.TypeFinderOptions.TypeFinderCriterias.Add(crit);
}
}
if (_options.TypeFinderOptions.TypeFinderCriterias.Any() != true)
{
var findAll = TypeFinderCriteriaBuilder
.Create()
.Tag(string.Empty)
.Build();
_options.TypeFinderOptions.TypeFinderCriterias.Add(findAll);
}
}
public async Task Initialize()
{
if (!string.IsNullOrWhiteSpace(_assemblyPath) && _assembly == null)
{
if (!File.Exists(_assemblyPath))
{
throw new ArgumentException($"Assembly in path {_assemblyPath} does not exist.");
}
}
if (_assembly == null && File.Exists(_assemblyPath) || File.Exists(_assemblyPath) && _pluginAssemblyLoadContext == null)
{
_pluginAssemblyLoadContext = new PluginAssemblyLoadContext(_assemblyPath, _options.PluginLoadContextOptions);
_assembly = _pluginAssemblyLoadContext.Load();
}
_plugins = new List<TypePluginCatalog>();
var finder = new TypeFinder();
var handledPluginTypes = new List<Type>();
foreach (var typeFinderCriteria in _options.TypeFinderOptions.TypeFinderCriterias)
{
var pluginTypes = finder.Find(typeFinderCriteria, _assembly, _pluginAssemblyLoadContext);
foreach (var type in pluginTypes)
{
if (handledPluginTypes.Contains(type))
{
// Make sure to create only a single type plugin catalog for each plugin type.
// The type catalog will add all the matching tags
continue;
}
var typePluginCatalog = new TypePluginCatalog(type,
new TypePluginCatalogOptions()
{
PluginNameOptions = _options.PluginNameOptions,
TypeFindingContext = _pluginAssemblyLoadContext,
TypeFinderOptions = _options.TypeFinderOptions
});
await typePluginCatalog.Initialize();
_plugins.Add(typePluginCatalog);
handledPluginTypes.Add(type);
}
}
IsInitialized = true;
}
public bool IsInitialized { get; private set; }
public List<Plugin> GetPlugins()
{
return _plugins.SelectMany(x => x.GetPlugins()).ToList();
}
public Plugin Get(string name, Version version)
{
foreach (var pluginCatalog in _plugins)
{
var foundPlugin = pluginCatalog.Get(name, version);
if (foundPlugin == null)
{
continue;
}
return foundPlugin;
}
return null;
}
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs
================================================
using System;
using System.Collections.Generic;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Context;
using Weikio.PluginFramework.TypeFinding;
namespace Weikio.PluginFramework.Catalogs
{
public class AssemblyPluginCatalogOptions
{
/// <summary>
/// Gets or sets the <see cref="PluginLoadContextOptions"/>.
/// </summary>
public PluginLoadContextOptions PluginLoadContextOptions = new PluginLoadContextOptions();
[Obsolete("Please use TypeFinderOptions. This will be removed in a future release.")]
public Dictionary<string, TypeFinderCriteria> TypeFinderCriterias = new Dictionary<string, TypeFinderCriteria>();
/// <summary>
/// Gets or sets how the plugin names and version should be defined. <seealso cref="PluginNameOptions"/>.
/// </summary>
public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions;
/// <summary>
/// Gets or sets the <see cref="TypeFinderOptions"/>.
/// </summary>
public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions();
public static class Defaults
{
public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
}
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;
namespace Weikio.PluginFramework.Catalogs
{
/// <summary>
/// Composite Plugin Catalog combines 1-n other Plugin Catalogs.
/// </summary>
public class CompositePluginCatalog : IPluginCatalog
{
private readonly List<IPluginCatalog> _catalogs;
/// <inheritdoc />
public bool IsInitialized { get; private set; }
/// <inheritdoc />
public List<Plugin> GetPlugins()
{
var result = new List<Plugin>();
foreach (var pluginCatalog in _catalogs)
{
var pluginsInCatalog = pluginCatalog.GetPlugins();
result.AddRange(pluginsInCatalog);
}
return result;
}
/// <inheritdoc />
public Plugin Get(string name, Version version)
{
foreach (var pluginCatalog in _catalogs)
{
var plugin = pluginCatalog.Get(name, version);
if (plugin == null)
{
continue;
}
return plugin;
}
return null;
}
public CompositePluginCatalog(params IPluginCatalog[] catalogs)
{
_catalogs = catalogs.ToList();
}
public void AddCatalog(IPluginCatalog catalog)
{
_catalogs.Add(catalog);
}
/// <inheritdoc />
public async Task Initialize()
{
if (_catalogs?.Any() != true)
{
IsInitialized = true;
return;
}
foreach (var pluginCatalog in _catalogs)
{
await pluginCatalog.Initialize();
}
IsInitialized = true;
}
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/ConversionRule.cs
================================================
using System;
using System.Reflection;
namespace Weikio.PluginFramework.Catalogs.Delegates
{
public class DelegateConversionRule
{
private readonly Predicate<ParameterInfo> _canHandle;
private readonly Func<ParameterInfo, ParameterConversion> _handle;
public DelegateConversionRule(Predicate<ParameterInfo> canHandle, Func<ParameterInfo, ParameterConversion> handle)
{
if (canHandle == null)
{
throw new ArgumentNullException(nameof(canHandle));
}
if (handle == null)
{
throw new ArgumentNullException(nameof(handle));
}
_canHandle = canHandle;
_handle = handle;
}
public bool CanHandle(ParameterInfo parameterInfo)
{
return _canHandle(parameterInfo);
}
public ParameterConversion Handle(ParameterInfo parameterInfo)
{
return _handle(parameterInfo);
}
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/DelegateCatalog.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.TypeFinding;
using Weikio.TypeGenerator;
using Weikio.TypeGenerator.Delegates;
namespace Weikio.PluginFramework.Catalogs.Delegates
{
public class DelegatePluginCatalog : IPluginCatalog
{
private TypePluginCatalog _catalog;
private readonly MulticastDelegate _multicastDelegate;
private readonly DelegatePluginCatalogOptions _options;
public DelegatePluginCatalog(MulticastDelegate multicastDelegate) : this(multicastDelegate, pluginName: null)
{
}
/// <summary>
/// Creates an instance of DelegatePluginCatalog
/// </summary>
/// <param name="multicastDelegate">Plugin's delegate</param>
/// <param name="pluginName">Name of the plugin</param>
public DelegatePluginCatalog(MulticastDelegate multicastDelegate, string pluginName = "") : this(multicastDelegate, null, null, null, pluginName)
{
}
public DelegatePluginCatalog(MulticastDelegate multicastDelegate, DelegatePluginCatalogOptions options) : this(multicastDelegate,
options?.ConversionRules, options?.NameOptions, options)
{
}
public DelegatePluginCatalog(MulticastDelegate multicastDelegate,
List<DelegateConversionRule> conversionRules = null,
PluginNameOptions nameOptions = null, DelegatePluginCatalogOptions options = null, string pluginName = null)
{
if (multicastDelegate == null)
{
throw new ArgumentNullException(nameof(multicastDelegate));
}
_multicastDelegate = multicastDelegate;
if (conversionRules == null)
{
conversionRules = new List<DelegateConversionRule>();
}
if (options != null)
{
_options = options;
}
else
{
_options = new DelegatePluginCatalogOptions();
}
_options.ConversionRules = conversionRules;
if (nameOptions == null)
{
nameOptions = new PluginNameOptions();
}
_options.NameOptions = nameOptions;
if (!string.IsNullOrWhiteSpace(pluginName))
{
_options.NameOptions.PluginNameGenerator = (pluginNameOptions, type) => pluginName;
}
}
public async Task Initialize()
{
var converter = new DelegateToTypeWrapper();
// Convert this catalog's options to the format supported by Delegate Wrapper.
// TODO: At some good point change the catalog so that it uses the Delegate Wrapper's options instead of defining its own.
var delegateToTypeWrapperOptions = ConvertOptions();
var assembly = converter.CreateType(_multicastDelegate, delegateToTypeWrapperOptions);
var options = new TypePluginCatalogOptions() { PluginNameOptions = _options.NameOptions };
if (_options.Tags?.Any() == true)
{
options.TypeFinderOptions = new TypeFinderOptions
{
TypeFinderCriterias = new List<TypeFinderCriteria> { TypeFinderCriteriaBuilder.Create().Tag(_options.Tags.ToArray()) }
};
}
_catalog = new TypePluginCatalog(assembly, options);
await _catalog.Initialize();
IsInitialized = true;
}
private DelegateToTypeWrapperOptions ConvertOptions()
{
var convRules = GetConversionRules();
return new DelegateToTypeWrapperOptions()
{
ConversionRules = convRules,
MethodName = _options.MethodName,
NamespaceName = _options.NamespaceName,
TypeName = _options.TypeName,
MethodNameGenerator = wrapperOptions => _options.MethodNameGenerator(_options),
NamespaceNameGenerator = wrapperOptions => _options.NamespaceNameGenerator(_options),
TypeNameGenerator = wrapperOptions => _options.TypeNameGenerator(_options),
};
}
private List<ParameterConversionRule> GetConversionRules()
{
var convRules = new List<ParameterConversionRule>();
foreach (var conversionRule in _options.ConversionRules)
{
var paramConversion = new ParameterConversionRule(conversionRule.CanHandle, info =>
{
var handleResult = conversionRule.Handle(info);
return new TypeGenerator.ParameterConversion()
{
Name = handleResult.Name, ToConstructor = handleResult.ToConstructor, ToPublicProperty = handleResult.ToPublicProperty
};
});
convRules.Add(paramConversion);
}
return convRules;
}
public bool IsInitialized { get; set; }
public List<Plugin> GetPlugins()
{
return _catalog.GetPlugins();
}
public Plugin Get(string name, Version version)
{
return _catalog.Get(name, version);
}
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/DelegatePluginCatalogOptions.cs
================================================
using System;
using System.Collections.Generic;
using System.Reflection;
using Weikio.PluginFramework.Abstractions;
namespace Weikio.PluginFramework.Catalogs.Delegates
{
public class DelegatePluginCatalogOptions
{
public PluginNameOptions NameOptions { get; set; } = new PluginNameOptions();
public List<DelegateConversionRule> ConversionRules { get; set; } = new List<DelegateConversionRule>();
public string MethodName { get; set; } = "Run";
public string TypeName { get; set; } = "GeneratedType";
public string NamespaceName { get; set; } = "GeneratedNamespace";
public Func<DelegatePluginCatalogOptions, string> MethodNameGenerator { get; set; } = options => options.MethodName;
public Func<DelegatePluginCatalogOptions, string> TypeNameGenerator { get; set; } = options => options.TypeName;
public Func<DelegatePluginCatalogOptions, string> NamespaceNameGenerator { get; set; } = options => options.NamespaceName;
public List<string> Tags { get; set; } = new List<string>();
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/ParameterConversion.cs
================================================
namespace Weikio.PluginFramework.Catalogs.Delegates
{
public class ParameterConversion
{
public bool ToConstructor { get; set; }
public bool ToPublicProperty { get; set; }
public string Name { get; set; }
}
}
================================================
FILE: src/Weikio.PluginFramework/Catalogs/EmptyPluginCatalog.cs
================================================
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;
namespace Weikio.PluginFramework.Catalogs
{
/// <summary>
/// Empty Plugin catalog. Doesn't contain anything, is automatically initialized when created.
/// </summary>
public class EmptyPluginCatalog : IPluginCatalog
{
/// <inheritdoc />
public Task Initialize()
{
return Task.CompletedTask;
}
/// <inheritdoc />
public bool IsInitialized { get; } = true;
/// <inheritdoc />
public List<Plugin> GetPlugins()
{
return new List<Plugin>();
}
/// <inheritdoc />
public Plugin Get(string name, Version version)
{
gitextract_7nw5d5uj/
├── .editorconfig
├── .gitignore
├── LICENSE
├── README.md
├── THIRD-PARTY-NOTICES.txt
├── docs/
│ ├── logo.pdn
│ └── logo_transparent_color.pdn
├── global.json
├── samples/
│ ├── BlazorApp/
│ │ ├── App.razor
│ │ ├── BlazorApp.csproj
│ │ ├── Data/
│ │ │ ├── WeatherForecast.cs
│ │ │ └── WeatherForecastService.cs
│ │ ├── Pages/
│ │ │ ├── Counter.razor
│ │ │ ├── Error.razor
│ │ │ ├── FetchData.razor
│ │ │ ├── Index.razor
│ │ │ └── _Host.cshtml
│ │ ├── Program.cs
│ │ ├── Shared/
│ │ │ ├── MainLayout.razor
│ │ │ ├── NavMenu.razor
│ │ │ └── SurveyPrompt.razor
│ │ ├── Startup.cs
│ │ ├── _Imports.razor
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot/
│ │ └── css/
│ │ ├── open-iconic/
│ │ │ ├── FONT-LICENSE
│ │ │ ├── ICON-LICENSE
│ │ │ ├── README.md
│ │ │ └── font/
│ │ │ └── fonts/
│ │ │ └── open-iconic.otf
│ │ └── site.css
│ ├── ConsoleApp/
│ │ ├── ConsoleApp.csproj
│ │ ├── FirstPlugin.cs
│ │ ├── MyPlugin.cs
│ │ ├── Program.cs
│ │ └── SecondPlugin.cs
│ ├── Shared/
│ │ ├── Weikio.PluginFramework.Samples.Shared/
│ │ │ ├── IMyPlugin.cs
│ │ │ ├── IOperator.cs
│ │ │ ├── IPlugin.cs
│ │ │ ├── RemainderOperator.cs
│ │ │ └── Weikio.PluginFramework.Samples.Shared.csproj
│ │ └── Weikio.PluginFramework.Samples.SharedPlugins/
│ │ ├── MinusOperator.cs
│ │ ├── MultiplyOperator.cs
│ │ ├── SecondSharedPlugin.cs
│ │ ├── SumOperator.cs
│ │ └── Weikio.PluginFramework.Samples.SharedPlugins.csproj
│ ├── WebApp/
│ │ ├── Controllers/
│ │ │ └── CalculatorController.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebApp.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppPluginsLibrary/
│ │ ├── CustomPlugin.cs
│ │ └── WebAppPluginsLibrary.csproj
│ ├── WebAppWithAppSettings/
│ │ ├── Controllers/
│ │ │ └── CalculatorController.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithAppSettings.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppWithDelegate/
│ │ ├── Controllers/
│ │ │ └── DelegateController.cs
│ │ ├── ExternalService.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithDelegate.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppWithNuget/
│ │ ├── Controllers/
│ │ │ └── CalculatorController.cs
│ │ ├── NugetLogger.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithNuget.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WebAppWithRoslyn/
│ │ ├── Controllers/
│ │ │ └── RoslynController.cs
│ │ ├── ExternalService.cs
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WebAppWithRoslyn.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── WinFormsApp/
│ │ ├── DivideOperator.cs
│ │ ├── Form1.Designer.cs
│ │ ├── Form1.cs
│ │ ├── Form1.resx
│ │ ├── Program.cs
│ │ └── WinFormsApp.csproj
│ ├── WinFormsPluginsLibrary/
│ │ ├── LabelPlugin.Designer.cs
│ │ ├── LabelPlugin.cs
│ │ ├── LabelPlugin.resx
│ │ ├── TestPlugin.Designer.cs
│ │ ├── TestPlugin.cs
│ │ ├── TestPlugin.resx
│ │ └── WinFormsPluginsLibrary.csproj
│ └── WpfApp/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── AssemblyInfo.cs
│ ├── DivideOperator.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ └── WpfApp.csproj
├── src/
│ ├── PluginFramework.sln
│ ├── Weikio.PluginFramework/
│ │ ├── Catalogs/
│ │ │ ├── AssemblyPluginCatalog.cs
│ │ │ ├── AssemblyPluginCatalogOptions.cs
│ │ │ ├── CompositePluginCatalog.cs
│ │ │ ├── Delegates/
│ │ │ │ ├── ConversionRule.cs
│ │ │ │ ├── DelegateCatalog.cs
│ │ │ │ ├── DelegatePluginCatalogOptions.cs
│ │ │ │ └── ParameterConversion.cs
│ │ │ ├── EmptyPluginCatalog.cs
│ │ │ ├── FolderPluginCatalog.cs
│ │ │ ├── FolderPluginCatalogOptions.cs
│ │ │ ├── TypePluginCatalog.cs
│ │ │ └── TypePluginCatalogOptions.cs
│ │ ├── Context/
│ │ │ ├── MetadataTypeFindingContext.cs
│ │ │ ├── PluginAssemblyLoadContext.cs
│ │ │ ├── PluginLoadContextOptions.cs
│ │ │ ├── RuntimeAssemblyHint.cs
│ │ │ └── UseHostApplicationAssembliesEnum.cs
│ │ ├── TypeFinding/
│ │ │ ├── ITypeFindingContext.cs
│ │ │ ├── TypeFinder.cs
│ │ │ ├── TypeFinderCriteria.cs
│ │ │ ├── TypeFinderCriteriaBuilder.cs
│ │ │ └── TypeFinderOptions.cs
│ │ └── Weikio.PluginFramework.csproj
│ ├── Weikio.PluginFramework.Abstractions/
│ │ ├── IPluginCatalog.cs
│ │ ├── IPluginCatalogExtensions.cs
│ │ ├── Plugin.cs
│ │ ├── PluginFrameworkOptions.cs
│ │ ├── PluginNameOptions.cs
│ │ └── Weikio.PluginFramework.Abstractions.csproj
│ ├── Weikio.PluginFramework.AspNetCore/
│ │ ├── DefaultPluginOption.cs
│ │ ├── PluginExtensions.cs
│ │ ├── PluginFrameworkInitializer.cs
│ │ ├── PluginProvider.cs
│ │ ├── ServiceCollectionExtensions.cs
│ │ ├── ServiceProviderExtensions.cs
│ │ └── Weikio.PluginFramework.AspNetCore.csproj
│ ├── Weikio.PluginFramework.Catalogs.NuGet/
│ │ ├── NugetFeedPluginCatalog.cs
│ │ ├── NugetFeedPluginCatalogOptions.cs
│ │ ├── NugetPackagePluginCatalog.cs
│ │ ├── NugetPluginCatalogOptions.cs
│ │ └── Weikio.PluginFramework.Catalogs.NuGet.csproj
│ ├── Weikio.PluginFramework.Catalogs.Roslyn/
│ │ ├── InvalidCodeException.cs
│ │ ├── RegularInitializer.cs
│ │ ├── RoslynPluginCatalog.cs
│ │ ├── RoslynPluginCatalogOptions.cs
│ │ ├── ScriptInitializer.cs
│ │ └── Weikio.PluginFramework.Catalogs.Roslyn.csproj
│ └── Weikio.PluginFramework.Configuration/
│ ├── CatalogConfiguration.cs
│ ├── Converters/
│ │ ├── AssemblyCatalogConfigurationCoverter.cs
│ │ ├── FolderCatalogConfigurationConverter.cs
│ │ └── IConfigurationToCatalogConverter.cs
│ ├── Providers/
│ │ ├── IPluginCatalogConfigurationLoader.cs
│ │ └── PluginCatalogConfigurationLoader.cs
│ └── Weikio.PluginFramework.Configuration.csproj
└── tests/
├── Assemblies/
│ ├── JsonNetNew/
│ │ ├── JsonNetNew.csproj
│ │ └── NewJsonResolver.cs
│ ├── JsonNetOld/
│ │ ├── JsonNetOld.csproj
│ │ └── OldJsonResolver.cs
│ ├── TestAssembly1/
│ │ ├── FirstPlugin.cs
│ │ ├── INotPluginInterface.cs
│ │ ├── NotAPlugin.cs
│ │ └── TestAssembly1.csproj
│ ├── TestAssembly2/
│ │ ├── SecondPlugin.cs
│ │ └── TestAssembly2.csproj
│ ├── TestAssembly3/
│ │ ├── TestAssembly3.csproj
│ │ └── ThirdAddon.cs
│ └── TestIntefaces/
│ ├── ICommand.cs
│ ├── IJsonVersionResolver.cs
│ └── TestIntefaces.csproj
├── integration/
│ ├── WebSites/
│ │ └── PluginFrameworkTestBed/
│ │ ├── Controllers/
│ │ │ └── WeatherForecastController.cs
│ │ ├── PluginFrameworkTestBed.csproj
│ │ ├── Program.cs
│ │ ├── Startup.cs
│ │ ├── WeatherForecast.cs
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Weikio.PluginFramework.AspNetCore.IntegrationTests/
│ │ ├── DefaultPluginTypeTests.cs
│ │ ├── TestBase.cs
│ │ ├── Weikio.PluginFramework.AspNetCore.IntegrationTests.csproj
│ │ └── xunit.runner.json
│ └── Weikio.PluginFramework.Catalogs.NuGet.Tests/
│ ├── NotThreadSafeResourceCollection.cs
│ ├── NuGet.Config
│ ├── NugetFeedPluginCatalogTests.cs
│ ├── NugetPackagePluginCatalogTests.cs
│ └── Weikio.PluginFramework.Catalogs.NuGet.Tests.csproj
└── unit/
├── Weikio.PluginFramework.Catalogs.Roslyn.Tests/
│ ├── RegularInitializerTests.cs
│ ├── RoslynPluginCatalogTests.cs
│ ├── ScriptInitializerTests.cs
│ ├── TestHelpers.cs
│ └── Weikio.PluginFramework.Catalogs.Roslyn.Tests.csproj
└── Weikio.PluginFramework.Tests/
├── AssemblyPluginCatalogTests.cs
├── DefaultOptionsTests.cs
├── DelegateCatalogTests.cs
├── FolderCatalogTests.cs
├── NotThreadSafeResourceCollection.cs
├── Plugins/
│ ├── AbstractPluginWithAttribute.cs
│ ├── AnotherPluginWithAttribute.cs
│ ├── MyPluginAttribute.cs
│ ├── PluginWithAttribute.cs
│ ├── TypePlugin.cs
│ └── TypePluginWithName.cs
├── TagTests.cs
├── TypeFinderTests.cs
├── TypePluginCatalogTests.cs
└── Weikio.PluginFramework.Tests.csproj
SYMBOL INDEX (539 symbols across 130 files)
FILE: samples/BlazorApp/Data/WeatherForecast.cs
class WeatherForecast (line 5) | public class WeatherForecast
FILE: samples/BlazorApp/Data/WeatherForecastService.cs
class WeatherForecastService (line 7) | public class WeatherForecastService
method GetForecastAsync (line 14) | public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
FILE: samples/BlazorApp/Program.cs
class Program (line 14) | public class Program
method Main (line 16) | public static void Main(string[] args)
method CreateHostBuilder (line 21) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: samples/BlazorApp/Startup.cs
class Startup (line 19) | public class Startup
method Startup (line 21) | public Startup(IConfiguration configuration)
method ConfigureServices (line 30) | public void ConfigureServices(IServiceCollection services)
method Configure (line 40) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: samples/ConsoleApp/FirstPlugin.cs
class FirstPlugin (line 6) | public class FirstPlugin : IPlugin
method Run (line 8) | public void Run()
FILE: samples/ConsoleApp/MyPlugin.cs
class MyPlugin (line 6) | public class MyPlugin : IMyPlugin
method Run (line 8) | public void Run()
FILE: samples/ConsoleApp/Program.cs
class Program (line 9) | class Program
method Main (line 11) | static async Task Main(string[] args)
method AssemblyCatalogSample (line 18) | private static async Task AssemblyCatalogSample()
method TypeCatalogSample (line 38) | private static async Task TypeCatalogSample()
method CompositeCatalogSample (line 51) | private static async Task CompositeCatalogSample()
FILE: samples/ConsoleApp/SecondPlugin.cs
class SecondPlugin (line 6) | public class SecondPlugin : IPlugin
method Run (line 8) | public void Run()
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/IMyPlugin.cs
type IMyPlugin (line 3) | public interface IMyPlugin
method Run (line 5) | void Run();
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/IOperator.cs
type IOperator (line 3) | public interface IOperator
method Calculate (line 5) | int Calculate(int x, int y);
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/IPlugin.cs
type IPlugin (line 5) | public interface IPlugin
method Run (line 7) | void Run();
type IOutPlugin (line 10) | public interface IOutPlugin
method Get (line 12) | string Get();
type IWidget (line 15) | public interface IWidget
type IDialog (line 20) | public interface IDialog
method Show (line 22) | void Show();
FILE: samples/Shared/Weikio.PluginFramework.Samples.Shared/RemainderOperator.cs
class RemainderOperator (line 3) | public class RemainderOperator : IOperator
method Calculate (line 5) | public int Calculate(int x, int y)
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/MinusOperator.cs
class MinusOperator (line 5) | public class MinusOperator : IOperator
method Calculate (line 7) | public int Calculate(int x, int y)
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/MultiplyOperator.cs
class MultiplyOperator (line 6) | [DisplayName("The multiplier plugin")]
method Calculate (line 9) | public int Calculate(int x, int y)
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/SecondSharedPlugin.cs
class SecondSharedPlugin (line 6) | public class SecondSharedPlugin : IOutPlugin
method Get (line 8) | public string Get()
FILE: samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/SumOperator.cs
class SumOperator (line 5) | public class SumOperator : IOperator
method Calculate (line 7) | public int Calculate(int x, int y)
FILE: samples/WebApp/Controllers/CalculatorController.cs
class CalculatorController (line 10) | [ApiController]
method CalculatorController (line 18) | public CalculatorController(IEnumerable<IOperator> operators, IEnumera...
method Get (line 25) | [HttpGet]
FILE: samples/WebApp/Program.cs
class Program (line 7) | public class Program
method Main (line 9) | public static void Main(string[] args)
method CreateHostBuilder (line 14) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: samples/WebApp/Startup.cs
class Startup (line 15) | public class Startup
method Startup (line 17) | public Startup(IConfiguration configuration)
method ConfigureServices (line 25) | public void ConfigureServices(IServiceCollection services)
method Configure (line 58) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: samples/WebAppPluginsLibrary/CustomPlugin.cs
class CustomPlugin (line 5) | public class CustomPlugin
FILE: samples/WebAppWithAppSettings/Controllers/CalculatorController.cs
class CalculatorController (line 12) | [ApiController]
method CalculatorController (line 20) | public CalculatorController(IEnumerable<Plugin> plugins, IServiceProvi...
method Get (line 27) | [HttpGet]
FILE: samples/WebAppWithAppSettings/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method CreateHostBuilder (line 13) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: samples/WebAppWithAppSettings/Startup.cs
class Startup (line 10) | public class Startup
method ConfigureServices (line 12) | public void ConfigureServices(IServiceCollection services)
method Configure (line 21) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: samples/WebAppWithDelegate/Controllers/DelegateController.cs
class DelegateController (line 12) | [ApiController]
method DelegateController (line 19) | public DelegateController(IPluginCatalog pluginCatalog, IServiceProvid...
method Get (line 25) | [HttpGet]
FILE: samples/WebAppWithDelegate/ExternalService.cs
class ExternalService (line 3) | public class ExternalService
method GetWords (line 5) | public string GetWords()
FILE: samples/WebAppWithDelegate/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method CreateHostBuilder (line 13) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: samples/WebAppWithDelegate/Startup.cs
class Startup (line 13) | public class Startup
method ConfigureServices (line 16) | public void ConfigureServices(IServiceCollection services)
method Configure (line 62) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: samples/WebAppWithNuget/Controllers/CalculatorController.cs
class CalculatorController (line 8) | [ApiController]
method CalculatorController (line 15) | public CalculatorController(IEnumerable<IOperator> operators, IEnumera...
method Get (line 21) | [HttpGet]
FILE: samples/WebAppWithNuget/NugetLogger.cs
class NugetLogger (line 9) | public class NugetLogger : LoggerBase
method NugetLogger (line 13) | public NugetLogger(IServiceCollection serviceCollection)
method Log (line 19) | public override void Log(ILogMessage message)
method LogAsync (line 49) | public override Task LogAsync(ILogMessage message)
FILE: samples/WebAppWithNuget/Program.cs
class Program (line 12) | public class Program
method Main (line 14) | public static void Main(string[] args)
method CreateHostBuilder (line 19) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: samples/WebAppWithNuget/Startup.cs
class Startup (line 20) | public class Startup
method Startup (line 22) | public Startup(IConfiguration configuration)
method ConfigureServices (line 30) | public void ConfigureServices(IServiceCollection services)
method Configure (line 53) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: samples/WebAppWithRoslyn/Controllers/RoslynController.cs
class RoslynController (line 12) | [ApiController]
method RoslynController (line 19) | public RoslynController(IPluginCatalog pluginCatalog, IServiceProvider...
method Get (line 25) | [HttpGet]
FILE: samples/WebAppWithRoslyn/ExternalService.cs
class ExternalService (line 3) | public class ExternalService
method DoWork (line 5) | public string DoWork()
FILE: samples/WebAppWithRoslyn/Program.cs
class Program (line 6) | public class Program
method Main (line 8) | public static void Main(string[] args)
method CreateHostBuilder (line 13) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: samples/WebAppWithRoslyn/Startup.cs
class Startup (line 14) | public class Startup
method Startup (line 16) | public Startup(IConfiguration configuration)
method ConfigureServices (line 24) | public void ConfigureServices(IServiceCollection services)
method Configure (line 66) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: samples/WinFormsApp/DivideOperator.cs
class DivideOperator (line 5) | public class DivideOperator : IOperator
method Calculate (line 7) | public int Calculate(int x, int y)
FILE: samples/WinFormsApp/Form1.Designer.cs
class Form1 (line 3) | partial class Form1
method Dispose (line 14) | protected override void Dispose(bool disposing)
method InitializeComponent (line 30) | private void InitializeComponent()
FILE: samples/WinFormsApp/Form1.cs
class Form1 (line 13) | public partial class Form1 : Form
method Form1 (line 17) | public Form1()
method Form1_Load (line 22) | private async void Form1_Load(object sender, EventArgs e)
method CreateCatalogs (line 38) | private async Task CreateCatalogs()
method AddCalculationOperators (line 85) | private void AddCalculationOperators()
method AddDialogs (line 94) | private void AddDialogs()
method AddButtons (line 110) | private void AddButtons()
method button1_Click (line 124) | private void button1_Click(object sender, EventArgs e)
FILE: samples/WinFormsApp/Program.cs
class Program (line 11) | static class Program
method Main (line 16) | [STAThread]
FILE: samples/WinFormsPluginsLibrary/LabelPlugin.Designer.cs
class LabelPlugin (line 6) | partial class LabelPlugin
method Dispose (line 17) | protected override void Dispose(bool disposing)
method InitializeComponent (line 33) | private void InitializeComponent()
FILE: samples/WinFormsPluginsLibrary/LabelPlugin.cs
class LabelPlugin (line 8) | public partial class LabelPlugin : Form, IDialog
method LabelPlugin (line 10) | public LabelPlugin()
method button1_Click (line 15) | private void button1_Click(object sender, EventArgs e)
FILE: samples/WinFormsPluginsLibrary/TestPlugin.Designer.cs
class TestPlugin (line 5) | partial class TestPlugin
method Dispose (line 16) | protected override void Dispose(bool disposing)
method InitializeComponent (line 32) | private void InitializeComponent()
FILE: samples/WinFormsPluginsLibrary/TestPlugin.cs
class TestPlugin (line 8) | [DisplayName("Hello World")]
method TestPlugin (line 11) | public TestPlugin()
method button1_Click (line 16) | private void button1_Click(object sender, EventArgs e)
FILE: samples/WpfApp/App.xaml.cs
class App (line 14) | public partial class App : Application
FILE: samples/WpfApp/DivideOperator.cs
class DivideOperator (line 5) | public class DivideOperator : IOperator
method Calculate (line 7) | public int Calculate(int x, int y)
FILE: samples/WpfApp/MainWindow.xaml.cs
class MainWindow (line 10) | public partial class MainWindow : Window
method MainWindow (line 14) | public MainWindow()
method MainWindow_OnLoaded (line 19) | private async void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
method ButtonBase_OnClick (line 41) | private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
FILE: src/Weikio.PluginFramework.Abstractions/IPluginCatalog.cs
type IPluginCatalog (line 11) | public interface IPluginCatalog
method Initialize (line 16) | Task Initialize();
method GetPlugins (line 27) | List<Plugin> GetPlugins();
method Get (line 33) | Plugin Get(string name, Version version);
FILE: src/Weikio.PluginFramework.Abstractions/IPluginCatalogExtensions.cs
class IPluginCatalogExtensions (line 7) | public static class IPluginCatalogExtensions
method Single (line 14) | public static Plugin Single(this IPluginCatalog catalog)
method Get (line 26) | public static Plugin Get(this IPluginCatalog catalog)
method GetByTag (line 37) | public static List<Plugin> GetByTag(this IPluginCatalog catalog, strin...
FILE: src/Weikio.PluginFramework.Abstractions/Plugin.cs
class Plugin (line 11) | public class Plugin
method Plugin (line 64) | public Plugin(Assembly assembly, Type type, string name, Version versi...
method ToString (line 92) | public override string ToString()
FILE: src/Weikio.PluginFramework.Abstractions/PluginFrameworkOptions.cs
class PluginFrameworkOptions (line 6) | public class PluginFrameworkOptions
FILE: src/Weikio.PluginFramework.Abstractions/PluginNameOptions.cs
class PluginNameOptions (line 11) | public class PluginNameOptions
FILE: src/Weikio.PluginFramework.AspNetCore/DefaultPluginOption.cs
class DefaultPluginOption (line 8) | public class DefaultPluginOption
FILE: src/Weikio.PluginFramework.AspNetCore/PluginExtensions.cs
class PluginExtensions (line 7) | public static class PluginExtensions
method Create (line 9) | public static object Create(this Plugin plugin, IServiceProvider servi...
method Create (line 14) | public static T Create<T>(this Plugin plugin, IServiceProvider service...
FILE: src/Weikio.PluginFramework.AspNetCore/PluginFrameworkInitializer.cs
class PluginFrameworkInitializer (line 12) | public class PluginFrameworkInitializer : IHostedService
method PluginFrameworkInitializer (line 17) | public PluginFrameworkInitializer(IEnumerable<IPluginCatalog> pluginCa...
method StartAsync (line 23) | public async Task StartAsync(CancellationToken cancellationToken)
method StopAsync (line 61) | public Task StopAsync(CancellationToken cancellationToken)
FILE: src/Weikio.PluginFramework.AspNetCore/PluginProvider.cs
class PluginProvider (line 9) | public class PluginProvider
method PluginProvider (line 14) | public PluginProvider(IEnumerable<IPluginCatalog> catalogs, IServicePr...
method GetByTag (line 20) | public List<Plugin> GetByTag(string tag)
method GetPlugins (line 33) | public List<Plugin> GetPlugins()
method Get (line 44) | public Plugin Get(string name, Version version)
method GetTypes (line 59) | public List<T> GetTypes<T>() where T : class
FILE: src/Weikio.PluginFramework.AspNetCore/ServiceCollectionExtensions.cs
class ServiceCollectionExtensions (line 22) | public static class ServiceCollectionExtensions
method AddPluginFramework (line 24) | public static IServiceCollection AddPluginFramework(this IServiceColle...
method AddPluginFramework (line 77) | public static IServiceCollection AddPluginFramework<TType>(this IServi...
method AddConfiguration (line 112) | private static IServiceCollection AddConfiguration(this IServiceCollec...
method AddPluginCatalog (line 174) | public static IServiceCollection AddPluginCatalog(this IServiceCollect...
method AddPluginType (line 181) | public static IServiceCollection AddPluginType<T>(this IServiceCollect...
method GetDefaultPluginOptions (line 211) | private static DefaultPluginOption GetDefaultPluginOptions<T>(Action<D...
FILE: src/Weikio.PluginFramework.AspNetCore/ServiceProviderExtensions.cs
class ServiceProviderExtensions (line 9) | public static class ServiceProviderExtensions
method Create (line 11) | public static object Create(this IServiceProvider serviceProvider, Plu...
method Create (line 16) | public static T Create<T>(this IServiceProvider serviceProvider, Plugi...
FILE: src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalog.cs
class NugetFeedPluginCatalog (line 14) | public class NugetFeedPluginCatalog : IPluginCatalog
method NugetFeedPluginCatalog (line 28) | public NugetFeedPluginCatalog(NuGetFeed packageFeed, string searchTerm...
method Get (line 70) | Plugin IPluginCatalog.Get(string name, Version version)
method Initialize (line 89) | public async Task Initialize()
method GetPlugins (line 116) | public List<Plugin> GetPlugins()
FILE: src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalogOptions.cs
class NugetFeedPluginCatalogOptions (line 10) | public class NugetFeedPluginCatalogOptions
class Defaults (line 39) | public static class Defaults
FILE: src/Weikio.PluginFramework.Catalogs.NuGet/NugetPackagePluginCatalog.cs
class NugetPackagePluginCatalog (line 16) | public class NugetPackagePluginCatalog : IPluginCatalog
method NugetPackagePluginCatalog (line 70) | public NugetPackagePluginCatalog(string packageName, string packageVer...
method GetPlugins (line 118) | public List<Plugin> GetPlugins()
method Get (line 123) | public Plugin Get(string name, Version version)
method Initialize (line 140) | public async Task Initialize()
FILE: src/Weikio.PluginFramework.Catalogs.NuGet/NugetPluginCatalogOptions.cs
class NugetPluginCatalogOptions (line 10) | public class NugetPluginCatalogOptions
class Defaults (line 59) | public static class Defaults
FILE: src/Weikio.PluginFramework.Catalogs.Roslyn/InvalidCodeException.cs
class InvalidCodeException (line 5) | public class InvalidCodeException : Exception
method InvalidCodeException (line 7) | public InvalidCodeException(Exception exception) : this("", exception)
method InvalidCodeException (line 11) | public InvalidCodeException(string message, Exception exception) : bas...
FILE: src/Weikio.PluginFramework.Catalogs.Roslyn/RegularInitializer.cs
class RegularInitializer (line 13) | public class RegularInitializer
method RegularInitializer (line 18) | public RegularInitializer(string code, RoslynPluginCatalogOptions opti...
method CreateAssembly (line 29) | public Task<Assembly> CreateAssembly()
FILE: src/Weikio.PluginFramework.Catalogs.Roslyn/RoslynPluginCatalog.cs
class RoslynPluginCatalog (line 16) | public class RoslynPluginCatalog : IPluginCatalog
method RoslynPluginCatalog (line 26) | public RoslynPluginCatalog(string code, RoslynPluginCatalogOptions opt...
method Get (line 40) | public Plugin Get(string name, Version version)
method IsScript (line 47) | private async Task<bool> IsScript()
method Initialize (line 75) | public async Task Initialize()
method GetPlugins (line 117) | public List<Plugin> GetPlugins()
FILE: src/Weikio.PluginFramework.Catalogs.Roslyn/RoslynPluginCatalogOptions.cs
class RoslynPluginCatalogOptions (line 8) | public class RoslynPluginCatalogOptions
FILE: src/Weikio.PluginFramework.Catalogs.Roslyn/ScriptInitializer.cs
class ScriptInitializer (line 19) | public class ScriptInitializer
method ScriptInitializer (line 24) | public ScriptInitializer(string code, RoslynPluginCatalogOptions options)
method CreateAssembly (line 52) | public async Task<Assembly> CreateAssembly()
method RemoveProperties (line 126) | private async Task<string> RemoveProperties(string currentScript)
method GetParameters (line 150) | private async Task<List<(string, Type)>> GetParameters()
method GetReturnType (line 187) | private async Task<Type> GetReturnType()
method GetParametersString (line 236) | private string GetParametersString(List<(string, Type)> parameters)
FILE: src/Weikio.PluginFramework.Configuration/CatalogConfiguration.cs
class CatalogConfiguration (line 6) | public class CatalogConfiguration
FILE: src/Weikio.PluginFramework.Configuration/Converters/AssemblyCatalogConfigurationCoverter.cs
class AssemblyCatalogConfigurationCoverter (line 11) | public class AssemblyCatalogConfigurationCoverter : IConfigurationToCata...
method CanConvert (line 14) | public bool CanConvert(string type)
method Convert (line 20) | public IPluginCatalog Convert(IConfigurationSection section)
FILE: src/Weikio.PluginFramework.Configuration/Converters/FolderCatalogConfigurationConverter.cs
class FolderCatalogConfigurationConverter (line 12) | public class FolderCatalogConfigurationConverter : IConfigurationToCatal...
method CanConvert (line 15) | public bool CanConvert(string type)
method Convert (line 21) | public IPluginCatalog Convert(IConfigurationSection configuration)
class CatalogFolderOptions (line 37) | private class CatalogFolderOptions
FILE: src/Weikio.PluginFramework.Configuration/Converters/IConfigurationToCatalogConverter.cs
type IConfigurationToCatalogConverter (line 9) | public interface IConfigurationToCatalogConverter
method CanConvert (line 17) | bool CanConvert(string type);
method Convert (line 24) | IPluginCatalog Convert(IConfigurationSection section);
FILE: src/Weikio.PluginFramework.Configuration/Providers/IPluginCatalogConfigurationLoader.cs
type IPluginCatalogConfigurationLoader (line 9) | public interface IPluginCatalogConfigurationLoader
method GetCatalogConfigurations (line 21) | List<CatalogConfiguration> GetCatalogConfigurations(IConfiguration con...
FILE: src/Weikio.PluginFramework.Configuration/Providers/PluginCatalogConfigurationLoader.cs
class PluginCatalogConfigurationLoader (line 12) | public class PluginCatalogConfigurationLoader : IPluginCatalogConfigurat...
method PluginCatalogConfigurationLoader (line 19) | public PluginCatalogConfigurationLoader(IOptions<PluginFrameworkOption...
method GetCatalogConfigurations (line 25) | public List<CatalogConfiguration> GetCatalogConfigurations(IConfigurat...
FILE: src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalog.cs
class AssemblyPluginCatalog (line 13) | public class AssemblyPluginCatalog : IPluginCatalog
method AssemblyPluginCatalog (line 21) | public AssemblyPluginCatalog(string assemblyPath) : this(assemblyPath,...
method AssemblyPluginCatalog (line 25) | public AssemblyPluginCatalog(Assembly assembly) : this(null, assembly)
method AssemblyPluginCatalog (line 29) | public AssemblyPluginCatalog(string assemblyPath, AssemblyPluginCatalo...
method AssemblyPluginCatalog (line 34) | public AssemblyPluginCatalog(Assembly assembly, AssemblyPluginCatalogO...
method AssemblyPluginCatalog (line 38) | public AssemblyPluginCatalog(string assemblyPath, TypeFinderCriteria c...
method AssemblyPluginCatalog (line 44) | public AssemblyPluginCatalog(string assemblyPath, Action<TypeFinderCri...
method AssemblyPluginCatalog (line 50) | public AssemblyPluginCatalog(Assembly assembly, Action<TypeFinderCrite...
method AssemblyPluginCatalog (line 56) | public AssemblyPluginCatalog(string assemblyPath, Predicate<Type> filt...
method AssemblyPluginCatalog (line 61) | public AssemblyPluginCatalog(Assembly assembly, Predicate<Type> filter...
method AssemblyPluginCatalog (line 66) | public AssemblyPluginCatalog(string assemblyPath, Dictionary<string, P...
method AssemblyPluginCatalog (line 71) | public AssemblyPluginCatalog(Assembly assembly, Dictionary<string, Pre...
method AssemblyPluginCatalog (line 76) | public AssemblyPluginCatalog(string assemblyPath = null, Assembly asse...
method SetFilters (line 99) | private void SetFilters(Predicate<Type> filter, Dictionary<string, Pre...
method Initialize (line 168) | public async Task Initialize()
method GetPlugins (line 223) | public List<Plugin> GetPlugins()
method Get (line 228) | public Plugin Get(string name, Version version)
FILE: src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs
class AssemblyPluginCatalogOptions (line 9) | public class AssemblyPluginCatalogOptions
class Defaults (line 29) | public static class Defaults
FILE: src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs
class CompositePluginCatalog (line 12) | public class CompositePluginCatalog : IPluginCatalog
method GetPlugins (line 20) | public List<Plugin> GetPlugins()
method Get (line 34) | public Plugin Get(string name, Version version)
method CompositePluginCatalog (line 51) | public CompositePluginCatalog(params IPluginCatalog[] catalogs)
method AddCatalog (line 56) | public void AddCatalog(IPluginCatalog catalog)
method Initialize (line 62) | public async Task Initialize()
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/ConversionRule.cs
class DelegateConversionRule (line 6) | public class DelegateConversionRule
method DelegateConversionRule (line 11) | public DelegateConversionRule(Predicate<ParameterInfo> canHandle, Func...
method CanHandle (line 27) | public bool CanHandle(ParameterInfo parameterInfo)
method Handle (line 32) | public ParameterConversion Handle(ParameterInfo parameterInfo)
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/DelegateCatalog.cs
class DelegatePluginCatalog (line 12) | public class DelegatePluginCatalog : IPluginCatalog
method DelegatePluginCatalog (line 19) | public DelegatePluginCatalog(MulticastDelegate multicastDelegate) : th...
method DelegatePluginCatalog (line 28) | public DelegatePluginCatalog(MulticastDelegate multicastDelegate, stri...
method DelegatePluginCatalog (line 32) | public DelegatePluginCatalog(MulticastDelegate multicastDelegate, Dele...
method DelegatePluginCatalog (line 37) | public DelegatePluginCatalog(MulticastDelegate multicastDelegate,
method Initialize (line 77) | public async Task Initialize()
method ConvertOptions (line 102) | private DelegateToTypeWrapperOptions ConvertOptions()
method GetConversionRules (line 118) | private List<ParameterConversionRule> GetConversionRules()
method GetPlugins (line 142) | public List<Plugin> GetPlugins()
method Get (line 147) | public Plugin Get(string name, Version version)
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/DelegatePluginCatalogOptions.cs
class DelegatePluginCatalogOptions (line 8) | public class DelegatePluginCatalogOptions
FILE: src/Weikio.PluginFramework/Catalogs/Delegates/ParameterConversion.cs
class ParameterConversion (line 3) | public class ParameterConversion
FILE: src/Weikio.PluginFramework/Catalogs/EmptyPluginCatalog.cs
class EmptyPluginCatalog (line 12) | public class EmptyPluginCatalog : IPluginCatalog
method Initialize (line 15) | public Task Initialize()
method GetPlugins (line 24) | public List<Plugin> GetPlugins()
method Get (line 30) | public Plugin Get(string name, Version version)
FILE: src/Weikio.PluginFramework/Catalogs/FolderPluginCatalog.cs
class FolderPluginCatalog (line 19) | public class FolderPluginCatalog : IPluginCatalog
method FolderPluginCatalog (line 36) | public FolderPluginCatalog(string folderPath) : this(folderPath, new F...
method FolderPluginCatalog (line 40) | public FolderPluginCatalog(string folderPath, FolderPluginCatalogOptio...
method FolderPluginCatalog (line 44) | public FolderPluginCatalog(string folderPath, Action<TypeFinderCriteri...
method FolderPluginCatalog (line 48) | public FolderPluginCatalog(string folderPath, TypeFinderCriteria finde...
method FolderPluginCatalog (line 52) | public FolderPluginCatalog(string folderPath, TypeFinderCriteria finde...
method FolderPluginCatalog (line 57) | public FolderPluginCatalog(string folderPath, Action<TypeFinderCriteri...
method FolderPluginCatalog (line 62) | public FolderPluginCatalog(string folderPath, Action<TypeFinderCriteri...
method GetPlugins (line 116) | public List<Plugin> GetPlugins()
method Get (line 122) | public Plugin Get(string name, Version version)
method Initialize (line 140) | public async Task Initialize()
method IsPluginAssembly (line 181) | private bool IsPluginAssembly(string assemblyPath)
method AddSharedFrameworkDlls (line 282) | private void AddSharedFrameworkDlls(string hostApplicationPath, string...
FILE: src/Weikio.PluginFramework/Catalogs/FolderPluginCatalogOptions.cs
class FolderPluginCatalogOptions (line 12) | public class FolderPluginCatalogOptions
class Defaults (line 51) | public static class Defaults
FILE: src/Weikio.PluginFramework/Catalogs/TypePluginCatalog.cs
class TypePluginCatalog (line 15) | public class TypePluginCatalog : IPluginCatalog
method TypePluginCatalog (line 32) | public TypePluginCatalog(Type pluginType) : this(pluginType, null, nul...
method TypePluginCatalog (line 36) | public TypePluginCatalog(Type pluginType, PluginNameOptions nameOption...
method TypePluginCatalog (line 40) | public TypePluginCatalog(Type pluginType, Action<PluginNameOptions> co...
method TypePluginCatalog (line 44) | public TypePluginCatalog(Type pluginType, TypePluginCatalogOptions opt...
method TypePluginCatalog (line 48) | public TypePluginCatalog(Type pluginType, Action<PluginNameOptions> co...
method Initialize (line 105) | public Task Initialize()
method GetPlugins (line 141) | public List<Plugin> GetPlugins()
method Get (line 147) | public Plugin Get(string name, Version version)
FILE: src/Weikio.PluginFramework/Catalogs/TypePluginCatalogOptions.cs
class TypePluginCatalogOptions (line 11) | public class TypePluginCatalogOptions
class Defaults (line 31) | public static class Defaults
FILE: src/Weikio.PluginFramework/Context/MetadataTypeFindingContext.cs
class MetadataTypeFindingContext (line 8) | public class MetadataTypeFindingContext : ITypeFindingContext
method MetadataTypeFindingContext (line 12) | public MetadataTypeFindingContext(MetadataLoadContext metadataLoadCont...
method FindAssembly (line 17) | public Assembly FindAssembly(string assemblyName)
method FindType (line 24) | public Type FindType(Type type)
FILE: src/Weikio.PluginFramework/Context/PluginAssemblyLoadContext.cs
class PluginAssemblyLoadContext (line 19) | public class PluginAssemblyLoadContext : AssemblyLoadContext, ITypeFindi...
method PluginAssemblyLoadContext (line 26) | public PluginAssemblyLoadContext(Assembly assembly, PluginLoadContextO...
method PluginAssemblyLoadContext (line 30) | public PluginAssemblyLoadContext(string pluginPath, PluginLoadContextO...
method Load (line 44) | public Assembly Load()
method Load (line 53) | protected override Assembly Load(AssemblyName assemblyName)
method TryUseHostApplicationAssembly (line 137) | private bool TryUseHostApplicationAssembly(AssemblyName assemblyName)
method LoadHostApplicationAssembly (line 180) | private bool LoadHostApplicationAssembly(AssemblyName assemblyName)
method LoadUnmanagedDll (line 194) | protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
method Log (line 213) | private void Log(LogLevel logLevel, string message, Exception ex = nul...
method GetLogger (line 223) | private ILogger<PluginAssemblyLoadContext> GetLogger()
method FindAssembly (line 247) | public Assembly FindAssembly(string assemblyName)
method FindType (line 252) | public Type FindType(Type type)
FILE: src/Weikio.PluginFramework/Context/PluginLoadContextOptions.cs
class PluginLoadContextOptions (line 12) | public class PluginLoadContextOptions
class Defaults (line 41) | public static class Defaults
FILE: src/Weikio.PluginFramework/Context/RuntimeAssemblyHint.cs
class RuntimeAssemblyHint (line 3) | public class RuntimeAssemblyHint
method RuntimeAssemblyHint (line 9) | public RuntimeAssemblyHint(string fileName, string path, bool isNative)
FILE: src/Weikio.PluginFramework/Context/UseHostApplicationAssembliesEnum.cs
type UseHostApplicationAssembliesEnum (line 3) | public enum UseHostApplicationAssembliesEnum
FILE: src/Weikio.PluginFramework/TypeFinding/ITypeFindingContext.cs
type ITypeFindingContext (line 6) | public interface ITypeFindingContext
method FindAssembly (line 8) | Assembly FindAssembly(string assemblyName);
method FindType (line 9) | Type FindType(Type type);
FILE: src/Weikio.PluginFramework/TypeFinding/TypeFinder.cs
class TypeFinder (line 8) | public class TypeFinder
method IsMatch (line 10) | public bool IsMatch(TypeFinderCriteria criteria, Type type, ITypeFindi...
method Find (line 113) | public List<Type> Find(TypeFinderCriteria criteria, Assembly assembly,...
method NameToRegex (line 139) | private static Regex NameToRegex(string nameFilter)
FILE: src/Weikio.PluginFramework/TypeFinding/TypeFinderCriteria.cs
class TypeFinderCriteria (line 6) | public class TypeFinderCriteria
FILE: src/Weikio.PluginFramework/TypeFinding/TypeFinderCriteriaBuilder.cs
class TypeFinderCriteriaBuilder (line 6) | public class TypeFinderCriteriaBuilder
method Build (line 17) | public TypeFinderCriteria Build()
method Create (line 39) | public static TypeFinderCriteriaBuilder Create()
method HasName (line 44) | public TypeFinderCriteriaBuilder HasName(string name)
method Implements (line 51) | public TypeFinderCriteriaBuilder Implements<T>()
method Implements (line 56) | public TypeFinderCriteriaBuilder Implements(Type t)
method Inherits (line 63) | public TypeFinderCriteriaBuilder Inherits<T>()
method Inherits (line 68) | public TypeFinderCriteriaBuilder Inherits(Type t)
method IsAbstract (line 75) | public TypeFinderCriteriaBuilder IsAbstract(bool? isAbstract)
method IsInterface (line 82) | public TypeFinderCriteriaBuilder IsInterface(bool? isInterface)
method AssignableTo (line 89) | public TypeFinderCriteriaBuilder AssignableTo(Type assignableTo)
method HasAttribute (line 96) | public TypeFinderCriteriaBuilder HasAttribute(Type attribute)
method Tag (line 103) | public TypeFinderCriteriaBuilder Tag(string tag)
method Tag (line 120) | public TypeFinderCriteriaBuilder Tag(params string[] tags)
FILE: src/Weikio.PluginFramework/TypeFinding/TypeFinderOptions.cs
class TypeFinderOptions (line 6) | public class TypeFinderOptions
class Defaults (line 13) | public static class Defaults
method GetDefaultTypeFinderCriterias (line 17) | public static ReadOnlyCollection<TypeFinderCriteria> GetDefaultTypeF...
FILE: tests/Assemblies/JsonNetNew/NewJsonResolver.cs
class NewJsonResolver (line 6) | public class NewJsonResolver : IJsonVersionResolver
method GetVersion (line 8) | public string GetVersion()
FILE: tests/Assemblies/JsonNetOld/OldJsonResolver.cs
class OldJsonResolver (line 7) | public class OldJsonResolver : IJsonVersionResolver
method GetVersion (line 9) | public string GetVersion()
method GetLoggingVersion (line 16) | public string GetLoggingVersion()
FILE: tests/Assemblies/TestAssembly1/FirstPlugin.cs
class FirstPlugin (line 5) | public class FirstPlugin : ICommand
method RunMe (line 7) | public string RunMe()
FILE: tests/Assemblies/TestAssembly1/INotPluginInterface.cs
type INotPluginInterface (line 3) | public interface INotPluginInterface
FILE: tests/Assemblies/TestAssembly1/NotAPlugin.cs
class NotAPlugin (line 3) | public abstract class NotAPlugin
FILE: tests/Assemblies/TestAssembly2/SecondPlugin.cs
class SecondPlugin (line 5) | public class SecondPlugin
FILE: tests/Assemblies/TestAssembly3/ThirdAddon.cs
class ThirdAddon (line 5) | public class ThirdAddon : ICommand
FILE: tests/Assemblies/TestIntefaces/ICommand.cs
type ICommand (line 5) | public interface ICommand
FILE: tests/Assemblies/TestIntefaces/IJsonVersionResolver.cs
type IJsonVersionResolver (line 3) | public interface IJsonVersionResolver
method GetVersion (line 5) | string GetVersion();
FILE: tests/integration/WebSites/PluginFrameworkTestBed/Controllers/WeatherForecastController.cs
class WeatherForecastController (line 10) | [ApiController]
method WeatherForecastController (line 21) | public WeatherForecastController(ILogger<WeatherForecastController> lo...
method Get (line 26) | [HttpGet]
FILE: tests/integration/WebSites/PluginFrameworkTestBed/Program.cs
class Program (line 12) | public class Program
method Main (line 14) | public static void Main(string[] args)
method CreateHostBuilder (line 19) | public static IHostBuilder CreateHostBuilder(string[] args) =>
FILE: tests/integration/WebSites/PluginFrameworkTestBed/Startup.cs
class Startup (line 16) | public class Startup
method Startup (line 18) | public Startup(IConfiguration configuration)
method ConfigureServices (line 26) | public void ConfigureServices(IServiceCollection services)
method Configure (line 32) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
FILE: tests/integration/WebSites/PluginFrameworkTestBed/WeatherForecast.cs
class WeatherForecast (line 5) | public class WeatherForecast
FILE: tests/integration/Weikio.PluginFramework.AspNetCore.IntegrationTests/DefaultPluginTypeTests.cs
class DefaultPluginTypeTests (line 13) | public class DefaultPluginTypeTests : TestBase
method DefaultPluginTypeTests (line 15) | public DefaultPluginTypeTests(WebApplicationFactory<Startup> factory, ...
method DefaultsToFirstPluginType (line 19) | [Fact]
method CanConfigureUsingAction (line 33) | [Fact]
method CanConfigureUsingOptions (line 49) | [Fact]
FILE: tests/integration/Weikio.PluginFramework.AspNetCore.IntegrationTests/TestBase.cs
class TestBase (line 14) | public class TestBase : IClassFixture<WebApplicationFactory<Startup>>
method TestBase (line 19) | protected TestBase(WebApplicationFactory<Startup> factory, ITestOutput...
method Init (line 25) | protected IServiceProvider Init(Action<IServiceCollection> action = null)
FILE: tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NotThreadSafeResourceCollection.cs
class NotThreadSafeResourceCollection (line 5) | [CollectionDefinition(nameof(NotThreadSafeResourceCollection), DisablePa...
FILE: tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetFeedPluginCatalogTests.cs
class NugetFeedPluginCatalogTests (line 15) | public class NugetFeedPluginCatalogTests
method NugetFeedPluginCatalogTests (line 21) | public NugetFeedPluginCatalogTests()
method AssertAssemblyFrameWork (line 27) | private void AssertAssemblyFrameWork(string targetFramework, Assembly ...
method InstallUsingTagFilter (line 36) | [Fact]
method CanTag (line 57) | [Fact]
method CanConfigureNamingOptions (line 76) | [Fact]
class DefaultOptions (line 99) | [Collection(nameof(NotThreadSafeResourceCollection))]
method DefaultOptions (line 102) | public DefaultOptions()
method CanConfigureDefaultNamingOptions (line 110) | [Fact]
method Dispose (line 129) | public void Dispose()
FILE: tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetPackagePluginCatalogTests.cs
class NugetPackagePluginCatalogTests (line 17) | public class NugetPackagePluginCatalogTests
method NugetPackagePluginCatalogTests (line 23) | public NugetPackagePluginCatalogTests()
method AssertAssemblyFrameWork (line 29) | private void AssertAssemblyFrameWork(string targetFramework, Assembly ...
method InstallPackageWithoutDepencencies (line 38) | [Fact]
method CanTag (line 58) | [Fact]
method CanConfigureNamingOptions (line 76) | [Fact]
method InstallPackageWithDepencencies (line 98) | [Fact]
method InstallPackageWithVersionWildcard (line 115) | [Fact]
method InstallPreReleasePackageWithVersionWildcard (line 129) | [Fact]
method InstallPackageFromFeed (line 150) | [Fact]
method InstallPackageFromFeedUsingFeedName (line 165) | [Fact]
method InstallPackageFromFeedUsingCustomNuGetConfig (line 179) | [Fact]
class DefaultOptions (line 194) | [Collection(nameof(NotThreadSafeResourceCollection))]
method DefaultOptions (line 197) | public DefaultOptions()
method CanConfigureDefaultNamingOptions (line 203) | [Fact]
method Dispose (line 220) | public void Dispose()
class NugetDownloadResultsSerialisation (line 226) | [Collection(nameof(NotThreadSafeResourceCollection))]
method NugetDownloadResultsSerialisation (line 231) | public NugetDownloadResultsSerialisation()
method SaveDownloadResultIfGivenCustomPackagesPath (line 237) | [Fact]
method Dispose (line 290) | public void Dispose()
method CanInstallPackageWithNativeDepencencies (line 296) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/RegularInitializerTests.cs
class RegularInitializerTests (line 9) | public class RegularInitializerTests
method ThrowsWithInvalidCode (line 11) | [Fact]
method ThrowsWithEmptyScript (line 32) | [Fact]
method CanCompileCode (line 42) | [Fact]
method CanAddReference (line 63) | [Fact]
method CanAddNamespace (line 80) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/RoslynPluginCatalogTests.cs
class RoslynPluginCatalogTests (line 12) | public class RoslynPluginCatalogTests
method ThrowsWithInvalidCode (line 14) | [Fact]
method ThrowsWithEmptyScript (line 35) | [Fact]
method CanHandleScript (line 45) | [Fact]
method ScriptAssemblyContainsValidVersion (line 61) | [Fact]
method ScriptContainsVersion1000ByDefault (line 76) | [Fact]
method CanHandleRegular (line 91) | [Fact]
method CanCreatePluginWithoutName (line 118) | [Fact]
method CanCreatePluginWithName (line 146) | [Fact]
method PluginDefaultsToVersion100 (line 175) | [Fact]
method CanCreatePluginWithNameAndVersion (line 204) | [Fact]
method CanGetAllFromCatalog (line 233) | [Fact]
method CanCreatePluginNameWithGenerator (line 261) | [Fact]
method CanCreatePluginVersionWithGenerator (line 293) | [Fact]
method CanTagCode (line 325) | [Fact]
method CanTagScript (line 350) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/ScriptInitializerTests.cs
class ScriptInitializerTests (line 8) | public class ScriptInitializerTests
method ThrowsWithInvalidScript (line 10) | [Fact]
method ThrowsWithEmptyScript (line 20) | [Fact]
method CanInitVoid (line 30) | [Fact]
method CanInitVoidWithParameter (line 46) | [Fact]
method CanInitVoidWithMultipleParameters (line 64) | [Fact]
method CanInitReturnString (line 82) | [Fact]
method CanInitReturnStringWithParameters (line 101) | [Fact]
method CanNotInitReturnValueTuple (line 118) | [Fact]
method ThrowsWithMissingTypeNameGenerator (line 126) | [Fact]
method ThrowsWithMissingNamespaceNameGenerator (line 135) | [Fact]
method HasDefaultTypeName (line 144) | [Fact]
method HasDefaultNamespace (line 159) | [Fact]
method DefaultsToReturningTask (line 174) | [Fact]
method HasDefaultMethodName (line 188) | [Fact]
method CanConfigureMethodName (line 202) | [Fact]
method CanConfigureMethodNameGenerator (line 217) | [Fact]
method CanConfigureTypeName (line 232) | [Fact]
method CanConfigureTypeNameGenerator (line 246) | [Fact]
method CanConfigureNamespace (line 262) | [Fact]
method CanConfigureNamespaceGenerator (line 276) | [Fact]
method CanConfigureReturnsTask (line 292) | [Fact]
method CanConfigureToHaveUniqueTypeNames (line 307) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/TestHelpers.cs
class TestHelpers (line 11) | public static class TestHelpers
method CompileScript (line 13) | public static async Task<List<Type>> CompileScript(string code, Roslyn...
method CompileRegular (line 23) | public static async Task<List<Type>> CompileRegular(string code, Rosly...
method CreateCatalog (line 33) | public static async Task<List<Type>> CreateCatalog(string code, Roslyn...
FILE: tests/unit/Weikio.PluginFramework.Tests/AssemblyPluginCatalogTests.cs
class AssemblyPluginCatalogTests (line 15) | public class AssemblyPluginCatalogTests
method AssemblyPluginCatalogTests (line 19) | public AssemblyPluginCatalogTests(ITestOutputHelper testOutputHelper)
method CanInitialize (line 24) | [Fact]
method CanInitializeWithCriteria (line 35) | [Fact]
method CanConfigureNamingOptions (line 50) | [Fact]
method ByDefaultOnlyContainsPublicNonAbstractClasses (line 70) | [Fact]
method CanIncludeAbstractClassesUsingCriteria (line 83) | [Fact]
method ThrowsIfAssemblyNotFound (line 99) | [Fact]
method ThrowsIfAssemblyPathMissing (line 107) | [Fact]
method CanUseReferencedDependencies (line 116) | [Fact]
method CanUseHostsDependencies (line 147) | [Fact]
method CanUseSelectedHostsDependencies (line 178) | [Fact]
class DefaultOptions (line 209) | [Collection(nameof(NotThreadSafeResourceCollection))]
method DefaultOptions (line 212) | public DefaultOptions()
method CanConfigureDefaultNamingOptions (line 220) | [Fact]
method CanOverrideDefaultNamingOptions (line 235) | [Fact]
method Dispose (line 264) | public void Dispose()
FILE: tests/unit/Weikio.PluginFramework.Tests/DefaultOptionsTests.cs
class DefaultOptionsTests (line 11) | public class DefaultOptionsTests
method CanConfigureDefaultOptions (line 13) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Tests/DelegateCatalogTests.cs
class DelegateCatalogTests (line 13) | public class DelegateCatalogTests
method DelegateCatalogTests (line 17) | public DelegateCatalogTests(ITestOutputHelper testOutputHelper)
method CanInitialize (line 22) | [Fact]
method CanInitializeFunc (line 37) | [Fact]
method CanInitializeAsyncAction (line 49) | [Fact]
method CanInitializeAsyncFunc (line 65) | [Fact]
method ByDefaultNoProperties (line 83) | [Fact]
method ByDefaultRunMethod (line 100) | [Fact]
method ByDefaultGeneratedNamespace (line 119) | [Fact]
method CanConfigurePluginNameFromConstructor (line 136) | [Fact]
method CanConfigureNamespace (line 152) | [Fact]
method CanConfigureNamespaceUsinGenerator (line 172) | [Fact]
method ByDefaultGeneratedTypeName (line 193) | [Fact]
method CanConfigureTypename (line 210) | [Fact]
method CanConfigureTypenameUsinGenerator (line 230) | [Fact]
method CanConfigureGeneratedMethodName (line 251) | [Fact]
method CanConfigureGeneratedMethodNameUsingGenerator (line 274) | [Fact]
method ByDefaultNoConstructorParameters (line 297) | [Fact]
method CanConvertParameterToProperty (line 319) | [Fact]
method CanConvertParameterToConstructorParameter (line 341) | [Fact]
method CanConvertMultipleParametersToConstructorAndPropertyParameters (line 364) | [Fact]
method CanSetPluginName (line 398) | [Fact]
method CanSetPluginNameAndVersion (line 415) | [Fact]
method CanConfigurePluginsHaveUniqueNames (line 434) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Tests/FolderCatalogTests.cs
class FolderCatalogTests (line 15) | public class FolderCatalogTests
method CanInitialize (line 19) | [Fact]
method CanInitializeWithCriteria (line 30) | [Fact]
method CanUseFolderOptions (line 45) | [Fact]
method FolderOptionsAreUsedToLimitLoadedAssemblies (line 72) | [Fact]
method CanConfigureNamingOptions (line 101) | [Fact]
method CanUseReferencedDependencies (line 120) | [Fact]
method CanUseSelectedHoststDependencies (line 149) | [Fact]
class DefaultOptions (line 181) | [Collection(nameof(NotThreadSafeResourceCollection))]
method DefaultOptions (line 184) | public DefaultOptions()
method CanConfigureDefaultNamingOptions (line 192) | [Fact]
method DefaultAssemblyNamingOptionsDoesntAffectFolderCatalogs (line 206) | [Fact]
method Dispose (line 225) | public void Dispose()
FILE: tests/unit/Weikio.PluginFramework.Tests/NotThreadSafeResourceCollection.cs
class NotThreadSafeResourceCollection (line 5) | [CollectionDefinition(nameof(NotThreadSafeResourceCollection), DisablePa...
FILE: tests/unit/Weikio.PluginFramework.Tests/Plugins/AbstractPluginWithAttribute.cs
class AbstractPluginWithAttribute (line 3) | [MyPlugin]
FILE: tests/unit/Weikio.PluginFramework.Tests/Plugins/AnotherPluginWithAttribute.cs
class AnotherPluginWithAttribute (line 3) | [MyPlugin]
FILE: tests/unit/Weikio.PluginFramework.Tests/Plugins/MyPluginAttribute.cs
class MyPluginAttribute (line 5) | [AttributeUsage(AttributeTargets.Class)]
FILE: tests/unit/Weikio.PluginFramework.Tests/Plugins/PluginWithAttribute.cs
class PluginWithAttribute (line 3) | [MyPlugin]
FILE: tests/unit/Weikio.PluginFramework.Tests/Plugins/TypePlugin.cs
class TypePlugin (line 3) | public class TypePlugin
FILE: tests/unit/Weikio.PluginFramework.Tests/Plugins/TypePluginWithName.cs
class TypePluginWithName (line 5) | [DisplayName("MyCustomName")]
FILE: tests/unit/Weikio.PluginFramework.Tests/TagTests.cs
class TagTests (line 13) | public class TagTests
method CanTagTypePlugin (line 15) | [Fact]
method CanTagAssemblyPlugin (line 37) | [Fact]
method CanTagAssemblyPluginUsingBuilder (line 53) | [Fact]
method CanTagFolderPlugin (line 72) | [Fact]
method CanTagDelegate (line 91) | [Fact]
method PluginCanContainManyTags (line 109) | [Fact]
class DefaultOptions (line 133) | [Collection(nameof(NotThreadSafeResourceCollection))]
method DefaultOptions (line 136) | public DefaultOptions()
method CanTagUsingDefaultOptions (line 143) | [Fact]
method TypeCatalogCanTagUsingDefaultOptions (line 162) | [Fact]
method DefaultTagsWithFolderCatalogTypeShouldNotDuplicatePlugins (line 175) | [Fact]
method DefaultTagsWithAssemblyCatalogTypeShouldNotDuplicatePlugins (line 188) | [Fact]
method Dispose (line 201) | public void Dispose()
FILE: tests/unit/Weikio.PluginFramework.Tests/TypeFinderTests.cs
class TypeFinderTests (line 8) | public class TypeFinderTests
method CanGetPluginsByAttribute (line 10) | [Fact]
method CanGetPluginsByMultipleCriteria (line 23) | [Fact]
FILE: tests/unit/Weikio.PluginFramework.Tests/TypePluginCatalogTests.cs
class TypePluginCatalogTests (line 9) | public class TypePluginCatalogTests
method CanInitialize (line 11) | [Fact]
method NameIsTypeFullName (line 21) | [Fact]
method CanConfigureNameResolver (line 32) | [Fact]
method CanSetNameByAttribute (line 48) | [Fact]
method CanConfigureNamingOptions (line 60) | [Fact]
method CanConfigureDefaultNamingOptions (line 77) | [Fact]
method CanOverrideDefaultNamingOptions (line 94) | [Fact]
Condensed preview — 206 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (446K chars).
[
{
"path": ".editorconfig",
"chars": 5651,
"preview": "root=true\n# EditorConfig is awesome:http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n# Don't use tabs f"
},
{
"path": ".gitignore",
"chars": 5582,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": "LICENSE",
"chars": 1064,
"preview": "MIT License\n\nCopyright (c) 2019 Weik.io\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof"
},
{
"path": "README.md",
"chars": 8059,
"preview": "<img align=\"right\" alt=\"Plugin Framework Logo\" src=\"docs/logo_transparent_color_256.png\">\n\n# Plugin Framework for .NET C"
},
{
"path": "THIRD-PARTY-NOTICES.txt",
"chars": 23155,
"preview": "Plugin Framework uses third-party libraries or other resources that may be\ndistributed under licenses different than the"
},
{
"path": "global.json",
"chars": 43,
"preview": "{\n \"sdk\": {\n \"version\": \"6.0.420\"\n }\n}"
},
{
"path": "samples/BlazorApp/App.razor",
"chars": 346,
"preview": "<Router AppAssembly=\"@typeof(Program).Assembly\">\n <Found Context=\"routeData\">\n <RouteView RouteData=\"@routeDa"
},
{
"path": "samples/BlazorApp/BlazorApp.csproj",
"chars": 605,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n "
},
{
"path": "samples/BlazorApp/Data/WeatherForecast.cs",
"chars": 296,
"preview": "using System;\n\nnamespace BlazorApp.Data\n{\n public class WeatherForecast\n {\n public DateTime Date { get; set"
},
{
"path": "samples/BlazorApp/Data/WeatherForecastService.cs",
"chars": 736,
"preview": "using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace BlazorApp.Data\n{\n public class WeatherForec"
},
{
"path": "samples/BlazorApp/Pages/Counter.razor",
"chars": 383,
"preview": "@page \"/counter\"\n@implements Weikio.PluginFramework.Samples.Shared.IWidget\n\n<p>Current count: @currentCount</p>\n\n<butto"
},
{
"path": "samples/BlazorApp/Pages/Error.razor",
"chars": 697,
"preview": "@page \"/error\"\n\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\"text-danger\">An error occurred while processing your re"
},
{
"path": "samples/BlazorApp/Pages/FetchData.razor",
"chars": 1029,
"preview": "@page \"/fetchdata\"\n@implements Weikio.PluginFramework.Samples.Shared.IWidget\n\n@using BlazorApp.Data\n@inject WeatherFore"
},
{
"path": "samples/BlazorApp/Pages/Index.razor",
"chars": 661,
"preview": "@page \"/\"\n@using Weikio.PluginFramework.Samples.Shared\n\n\n<h1>Widget dashboard</h1>\n<div class=\"row\">\n\n @foreach (var"
},
{
"path": "samples/BlazorApp/Pages/_Host.cshtml",
"chars": 988,
"preview": "@page \"/\"\n@namespace BlazorApp.Pages\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n@{\n Layout = null;\n}\n\n<!DO"
},
{
"path": "samples/BlazorApp/Program.cs",
"chars": 736,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing "
},
{
"path": "samples/BlazorApp/Shared/MainLayout.razor",
"chars": 280,
"preview": "@inherits LayoutComponentBase\n\n<div class=\"sidebar\">\n <NavMenu/>\n</div>\n\n<div class=\"main\">\n <div class=\"top-row "
},
{
"path": "samples/BlazorApp/Shared/NavMenu.razor",
"chars": 783,
"preview": "<div class=\"top-row pl-4 navbar navbar-dark\">\n <a class=\"navbar-brand\" href=\"\">Plugin Framework</a>\n <button clas"
},
{
"path": "samples/BlazorApp/Shared/SurveyPrompt.razor",
"chars": 462,
"preview": "@implements Weikio.PluginFramework.Samples.Shared.IWidget\n<div class=\"alert alert-secondary mt-4\" role=\"alert\">\n <sp"
},
{
"path": "samples/BlazorApp/Startup.cs",
"chars": 2105,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Tasks"
},
{
"path": "samples/BlazorApp/_Imports.razor",
"chars": 321,
"preview": "@using System.Net.Http\n@using Microsoft.AspNetCore.Authorization\n@using Microsoft.AspNetCore.Components.Authorization\n@"
},
{
"path": "samples/BlazorApp/appsettings.Development.json",
"chars": 185,
"preview": "{\n \"DetailedErrors\": true,\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning"
},
{
"path": "samples/BlazorApp/appsettings.json",
"chars": 182,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/BlazorApp/wwwroot/css/open-iconic/FONT-LICENSE",
"chars": 4017,
"preview": "SIL OPEN FONT LICENSE Version 1.1\n\nCopyright (c) 2014 Waybury\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to "
},
{
"path": "samples/BlazorApp/wwwroot/css/open-iconic/ICON-LICENSE",
"chars": 1073,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Waybury\n\nPermission is hereby granted, free of charge, to any person obtaining"
},
{
"path": "samples/BlazorApp/wwwroot/css/open-iconic/README.md",
"chars": 3495,
"preview": "[Open Iconic v1.1.1](http://useiconic.com/open)\n===========\n\n### Open Iconic is the open source sibling of [Iconic](http"
},
{
"path": "samples/BlazorApp/wwwroot/css/site.css",
"chars": 3422,
"preview": "@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');\n\nhtml, body {\n font-family: 'Helvetica Neue', Helv"
},
{
"path": "samples/ConsoleApp/ConsoleApp.csproj",
"chars": 572,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net"
},
{
"path": "samples/ConsoleApp/FirstPlugin.cs",
"chars": 229,
"preview": "using System;\nusing Weikio.PluginFramework.Samples.Shared;\n\nnamespace ConsoleApp\n{\n public class FirstPlugin : IPlug"
},
{
"path": "samples/ConsoleApp/MyPlugin.cs",
"chars": 252,
"preview": "using System;\nusing Weikio.PluginFramework.Samples.Shared;\n\nnamespace ConsoleApp\n{\n public class MyPlugin : IMyPlugi"
},
{
"path": "samples/ConsoleApp/Program.cs",
"chars": 3043,
"preview": "using System;\nusing System.Threading.Tasks;\nusing Weikio.PluginFramework.Samples.Shared;\nusing Weikio.PluginFramework.A"
},
{
"path": "samples/ConsoleApp/SecondPlugin.cs",
"chars": 231,
"preview": "using System;\nusing Weikio.PluginFramework.Samples.Shared;\n\nnamespace ConsoleApp\n{\n public class SecondPlugin : IPlu"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.Shared/IMyPlugin.cs",
"chars": 116,
"preview": "namespace Weikio.PluginFramework.Samples.Shared\n{\n public interface IMyPlugin\n {\n void Run();\n }\n}\n"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.Shared/IOperator.cs",
"chars": 133,
"preview": "namespace Weikio.PluginFramework.Samples.Shared\n{\n public interface IOperator\n {\n int Calculate(int x, int"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.Shared/IPlugin.cs",
"chars": 335,
"preview": "using System;\n\nnamespace Weikio.PluginFramework.Samples.Shared\n{\n public interface IPlugin\n {\n void Run();"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.Shared/RemainderOperator.cs",
"chars": 201,
"preview": "namespace Weikio.PluginFramework.Samples.Shared\n{\n public class RemainderOperator : IOperator\n {\n public i"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.Shared/Weikio.PluginFramework.Samples.Shared.csproj",
"chars": 685,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n <IsPackabl"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/MinusOperator.cs",
"chars": 249,
"preview": "using Weikio.PluginFramework.Samples.Shared;\n\nnamespace Weikio.PluginFramework.Samples.SharedPlugins\n{\n public class"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/MultiplyOperator.cs",
"chars": 325,
"preview": "using System.ComponentModel;\nusing Weikio.PluginFramework.Samples.Shared;\n\nnamespace Weikio.PluginFramework.Samples.Sha"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/SecondSharedPlugin.cs",
"chars": 272,
"preview": "using System;\nusing Weikio.PluginFramework.Samples.Shared;\n\nnamespace Weikio.PluginFramework.Samples.SharedPlugins\n{\n "
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/SumOperator.cs",
"chars": 247,
"preview": "using Weikio.PluginFramework.Samples.Shared;\n\nnamespace Weikio.PluginFramework.Samples.SharedPlugins\n{\n public class"
},
{
"path": "samples/Shared/Weikio.PluginFramework.Samples.SharedPlugins/Weikio.PluginFramework.Samples.SharedPlugins.csproj",
"chars": 880,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n <IsPackabl"
},
{
"path": "samples/WebApp/Controllers/CalculatorController.cs",
"chars": 1182,
"preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Text.Json;\nusing Microsoft.AspNetCore.Mvc;\nusing Weiki"
},
{
"path": "samples/WebApp/Program.cs",
"chars": 555,
"preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Hosting;\n\nnames"
},
{
"path": "samples/WebApp/Startup.cs",
"chars": 2892,
"preview": "using System.Collections.Generic;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsof"
},
{
"path": "samples/WebApp/WebApp.csproj",
"chars": 750,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n "
},
{
"path": "samples/WebApp/appsettings.Development.json",
"chars": 159,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebApp/appsettings.json",
"chars": 182,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppPluginsLibrary/CustomPlugin.cs",
"chars": 93,
"preview": "using System;\n\nnamespace WebAppPluginsLibrary\n{\n public class CustomPlugin\n {\n }\n}\n"
},
{
"path": "samples/WebAppPluginsLibrary/WebAppPluginsLibrary.csproj",
"chars": 146,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </P"
},
{
"path": "samples/WebAppWithAppSettings/Controllers/CalculatorController.cs",
"chars": 1840,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Exte"
},
{
"path": "samples/WebAppWithAppSettings/Program.cs",
"chars": 528,
"preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace WebAppWithAppSettings\n{\n public cl"
},
{
"path": "samples/WebAppWithAppSettings/Startup.cs",
"chars": 1194,
"preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.DependencyInjection;\n"
},
{
"path": "samples/WebAppWithAppSettings/WebAppWithAppSettings.csproj",
"chars": 839,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n "
},
{
"path": "samples/WebAppWithAppSettings/appsettings.Development.json",
"chars": 159,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppWithAppSettings/appsettings.json",
"chars": 317,
"preview": "{\n \"PluginFramework\": {\n \"Catalogs\": [\n {\n \"Type\": \"Folder\",\n \"Path\": \"..\\\\Shared\\\\Weikio.PluginF"
},
{
"path": "samples/WebAppWithDelegate/Controllers/DelegateController.cs",
"chars": 1654,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
},
{
"path": "samples/WebAppWithDelegate/ExternalService.cs",
"chars": 182,
"preview": "namespace WebAppWithDelegate\n{\n public class ExternalService\n {\n public string GetWords()\n {\n "
},
{
"path": "samples/WebAppWithDelegate/Program.cs",
"chars": 525,
"preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace WebAppWithDelegate\n{\n public class"
},
{
"path": "samples/WebAppWithDelegate/Startup.cs",
"chars": 3196,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.AspNetCore.Builder;\nusing Micro"
},
{
"path": "samples/WebAppWithDelegate/WebAppWithDelegate.csproj",
"chars": 549,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n </Proper"
},
{
"path": "samples/WebAppWithDelegate/appsettings.Development.json",
"chars": 159,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppWithDelegate/appsettings.json",
"chars": 182,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppWithNuget/Controllers/CalculatorController.cs",
"chars": 805,
"preview": "using System.Collections.Generic;\nusing Microsoft.AspNetCore.Mvc;\nusing Weikio.PluginFramework.Abstractions;\nusing Weik"
},
{
"path": "samples/WebAppWithNuget/NugetLogger.cs",
"chars": 1607,
"preview": "using System.Threading.Tasks;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\nusing"
},
{
"path": "samples/WebAppWithNuget/Program.cs",
"chars": 697,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetC"
},
{
"path": "samples/WebAppWithNuget/Startup.cs",
"chars": 2295,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing "
},
{
"path": "samples/WebAppWithNuget/WebAppWithNuget.csproj",
"chars": 566,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n "
},
{
"path": "samples/WebAppWithNuget/appsettings.Development.json",
"chars": 159,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppWithNuget/appsettings.json",
"chars": 182,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppWithRoslyn/Controllers/RoslynController.cs",
"chars": 1378,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
},
{
"path": "samples/WebAppWithRoslyn/ExternalService.cs",
"chars": 181,
"preview": "namespace WebAppWithRoslyn\n{\n public class ExternalService\n {\n public string DoWork()\n {\n "
},
{
"path": "samples/WebAppWithRoslyn/Program.cs",
"chars": 523,
"preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace WebAppWithRoslyn\n{\n public class P"
},
{
"path": "samples/WebAppWithRoslyn/Startup.cs",
"chars": 3139,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.AspNetCore.Builder;\nusing Micro"
},
{
"path": "samples/WebAppWithRoslyn/WebAppWithRoslyn.csproj",
"chars": 680,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n </Proper"
},
{
"path": "samples/WebAppWithRoslyn/appsettings.Development.json",
"chars": 159,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WebAppWithRoslyn/appsettings.json",
"chars": 182,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "samples/WinFormsApp/DivideOperator.cs",
"chars": 218,
"preview": "using Weikio.PluginFramework.Samples.Shared;\n\nnamespace WinFormsApp\n{\n public class DivideOperator : IOperator\n {"
},
{
"path": "samples/WinFormsApp/Form1.Designer.cs",
"chars": 4886,
"preview": "namespace WinFormsApp\n{\n partial class Form1\n {\n /// <summary>\n /// Required designer variable.\n "
},
{
"path": "samples/WinFormsApp/Form1.cs",
"chars": 5021,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing Weikio."
},
{
"path": "samples/WinFormsApp/Form1.resx",
"chars": 5891,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "samples/WinFormsApp/Program.cs",
"chars": 630,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing "
},
{
"path": "samples/WinFormsApp/WinFormsApp.csproj",
"chars": 506,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <"
},
{
"path": "samples/WinFormsPluginsLibrary/LabelPlugin.Designer.cs",
"chars": 2473,
"preview": "using System.ComponentModel;\nusing System.Drawing;\n\nnamespace WinFormsPluginsLibrary\n{\n partial class LabelPlugin\n "
},
{
"path": "samples/WinFormsPluginsLibrary/LabelPlugin.cs",
"chars": 441,
"preview": "using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing Weikio.PluginFramework.Samples.Shared;\n\nna"
},
{
"path": "samples/WinFormsPluginsLibrary/LabelPlugin.resx",
"chars": 5696,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "samples/WinFormsPluginsLibrary/TestPlugin.Designer.cs",
"chars": 2109,
"preview": "using System.ComponentModel;\n\nnamespace WinFormsPluginsLibrary\n{\n partial class TestPlugin\n {\n /// <summar"
},
{
"path": "samples/WinFormsPluginsLibrary/TestPlugin.cs",
"chars": 475,
"preview": "using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing Weikio.PluginFramework.Samples.Shared;\n\nna"
},
{
"path": "samples/WinFormsPluginsLibrary/TestPlugin.resx",
"chars": 5696,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "samples/WinFormsPluginsLibrary/WinFormsPluginsLibrary.csproj",
"chars": 584,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFra"
},
{
"path": "samples/WpfApp/App.xaml",
"chars": 355,
"preview": "<Application x:Class=\"WpfApp.App\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
},
{
"path": "samples/WpfApp/App.xaml.cs",
"chars": 320,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing"
},
{
"path": "samples/WpfApp/AssemblyInfo.cs",
"chars": 445,
"preview": "using System.Windows;\n\n[assembly: ThemeInfo(\n ResourceDictionaryLocation.None, //where theme specific resource dictio"
},
{
"path": "samples/WpfApp/DivideOperator.cs",
"chars": 213,
"preview": "using Weikio.PluginFramework.Samples.Shared;\n\nnamespace WpfApp\n{\n public class DivideOperator : IOperator\n {\n "
},
{
"path": "samples/WpfApp/MainWindow.xaml",
"chars": 1121,
"preview": "<Window x:Class=\"WpfApp.MainWindow\"\n xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n x"
},
{
"path": "samples/WpfApp/MainWindow.xaml.cs",
"chars": 1812,
"preview": "using System;\nusing System.Collections.ObjectModel;\nusing System.Windows;\nusing Weikio.PluginFramework.Samples.Shared;\n"
},
{
"path": "samples/WpfApp/WpfApp.csproj",
"chars": 620,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <"
},
{
"path": "src/PluginFramework.sln",
"chars": 19440,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.3033"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalog.cs",
"chars": 9236,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing Syst"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/AssemblyPluginCatalogOptions.cs",
"chars": 1340,
"preview": "using System;\nusing System.Collections.Generic;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio.PluginFramework"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/CompositePluginCatalog.cs",
"chars": 1911,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Weikio.PluginFra"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/Delegates/ConversionRule.cs",
"chars": 1035,
"preview": "using System;\nusing System.Reflection;\n\nnamespace Weikio.PluginFramework.Catalogs.Delegates\n{\n public class Delegate"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/Delegates/DelegateCatalog.cs",
"chars": 5410,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Weikio.PluginFra"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/Delegates/DelegatePluginCatalogOptions.cs",
"chars": 1070,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Weikio.PluginFramework.Abstractions;\n\nna"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/Delegates/ParameterConversion.cs",
"chars": 245,
"preview": "namespace Weikio.PluginFramework.Catalogs.Delegates\n{\n public class ParameterConversion\n {\n public bool To"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/EmptyPluginCatalog.cs",
"chars": 851,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing Weikio.Plu"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/FolderPluginCatalog.cs",
"chars": 12324,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing Syst"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/FolderPluginCatalogOptions.cs",
"chars": 2316,
"preview": "using System;\nusing System.Collections.Generic;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio.PluginFramework"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/TypePluginCatalog.cs",
"chars": 5305,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Task"
},
{
"path": "src/Weikio.PluginFramework/Catalogs/TypePluginCatalogOptions.cs",
"chars": 1393,
"preview": "using System;\nusing System.Collections.Generic;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio.PluginFramework"
},
{
"path": "src/Weikio.PluginFramework/Context/MetadataTypeFindingContext.cs",
"chars": 1169,
"preview": "using System;\nusing System.Linq;\nusing System.Reflection;\nusing Weikio.PluginFramework.TypeFinding;\n\nnamespace Weikio.P"
},
{
"path": "src/Weikio.PluginFramework/Context/PluginAssemblyLoadContext.cs",
"chars": 10145,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.IO;\nusing System.Linq;\nusing System.Ref"
},
{
"path": "src/Weikio.PluginFramework/Context/PluginLoadContextOptions.cs",
"chars": 4045,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Microsoft.Extensions.Logging;\nusing Micr"
},
{
"path": "src/Weikio.PluginFramework/Context/RuntimeAssemblyHint.cs",
"chars": 415,
"preview": "namespace Weikio.PluginFramework.Context\n{\n public class RuntimeAssemblyHint\n {\n public string FileName { g"
},
{
"path": "src/Weikio.PluginFramework/Context/UseHostApplicationAssembliesEnum.cs",
"chars": 656,
"preview": "namespace Weikio.PluginFramework.Context\n{\n public enum UseHostApplicationAssembliesEnum\n {\n /// <summary>"
},
{
"path": "src/Weikio.PluginFramework/TypeFinding/ITypeFindingContext.cs",
"chars": 228,
"preview": "using System;\nusing System.Reflection;\n\nnamespace Weikio.PluginFramework.TypeFinding\n{\n public interface ITypeFindin"
},
{
"path": "src/Weikio.PluginFramework/TypeFinding/TypeFinder.cs",
"chars": 4375,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\n\nnamespa"
},
{
"path": "src/Weikio.PluginFramework/TypeFinding/TypeFinderCriteria.cs",
"chars": 605,
"preview": "using System;\nusing System.Collections.Generic;\n\nnamespace Weikio.PluginFramework.TypeFinding\n{\n public class TypeFi"
},
{
"path": "src/Weikio.PluginFramework/TypeFinding/TypeFinderCriteriaBuilder.cs",
"chars": 3306,
"preview": "using System;\nusing System.Collections.Generic;\n\nnamespace Weikio.PluginFramework.TypeFinding\n{\n public class TypeFi"
},
{
"path": "src/Weikio.PluginFramework/TypeFinding/TypeFinderOptions.cs",
"chars": 785,
"preview": "using System.Collections.Generic;\nusing System.Collections.ObjectModel;\n\nnamespace Weikio.PluginFramework.TypeFinding\n{"
},
{
"path": "src/Weikio.PluginFramework/Weikio.PluginFramework.csproj",
"chars": 1621,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>\n "
},
{
"path": "src/Weikio.PluginFramework.Abstractions/IPluginCatalog.cs",
"chars": 959,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Threading.Tasks;\n\nnamespace Weiki"
},
{
"path": "src/Weikio.PluginFramework.Abstractions/IPluginCatalogExtensions.cs",
"chars": 1479,
"preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Weikio.PluginFramework.Ab"
},
{
"path": "src/Weikio.PluginFramework.Abstractions/Plugin.cs",
"chars": 2509,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace Weikio.PluginFra"
},
{
"path": "src/Weikio.PluginFramework.Abstractions/PluginFrameworkOptions.cs",
"chars": 330,
"preview": "namespace Weikio.PluginFramework.Abstractions\n{\n /// <summary>\n /// Configures the options for Plugin Framework.\n"
},
{
"path": "src/Weikio.PluginFramework.Abstractions/PluginNameOptions.cs",
"chars": 3652,
"preview": "using System;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Reflection;\n\nnamespace Weikio.PluginF"
},
{
"path": "src/Weikio.PluginFramework.Abstractions/Weikio.PluginFramework.Abstractions.csproj",
"chars": 1000,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n <IsPacka"
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/DefaultPluginOption.cs",
"chars": 363,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Weikio.PluginFramework."
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/PluginExtensions.cs",
"chars": 694,
"preview": "using System;\nusing Weikio.PluginFramework.Abstractions;\n\n// ReSharper disable once CheckNamespace\nnamespace Microsoft."
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/PluginFrameworkInitializer.cs",
"chars": 2281,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks"
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/PluginProvider.cs",
"chars": 2138,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.Extensions.DependencyInjection;\nusin"
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/ServiceCollectionExtensions.cs",
"chars": 9078,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing Micro"
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/ServiceProviderExtensions.cs",
"chars": 676,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Weikio.PluginFramework.Abstractions;\n\n// ReSha"
},
{
"path": "src/Weikio.PluginFramework.AspNetCore/Weikio.PluginFramework.AspNetCore.csproj",
"chars": 1545,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>\n "
},
{
"path": "src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalog.cs",
"chars": 4249,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing "
},
{
"path": "src/Weikio.PluginFramework.Catalogs.NuGet/NugetFeedPluginCatalogOptions.cs",
"chars": 2171,
"preview": "using System;\nusing NuGet.Common;\nusing Weikio.NugetDownloader;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio."
},
{
"path": "src/Weikio.PluginFramework.Catalogs.NuGet/NugetPackagePluginCatalog.cs",
"chars": 7722,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing "
},
{
"path": "src/Weikio.PluginFramework.Catalogs.NuGet/NugetPluginCatalogOptions.cs",
"chars": 3760,
"preview": "using System;\nusing NuGet.Common;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio.PluginFramework.Catalogs.NuGet"
},
{
"path": "src/Weikio.PluginFramework.Catalogs.NuGet/Weikio.PluginFramework.Catalogs.NuGet.csproj",
"chars": 1470,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>\n "
},
{
"path": "src/Weikio.PluginFramework.Catalogs.Roslyn/InvalidCodeException.cs",
"chars": 351,
"preview": "using System;\n\nnamespace Weikio.PluginFramework.Catalogs.Roslyn\n{\n public class InvalidCodeException : Exception\n "
},
{
"path": "src/Weikio.PluginFramework.Catalogs.Roslyn/RegularInitializer.cs",
"chars": 2444,
"preview": "using System;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Weikio"
},
{
"path": "src/Weikio.PluginFramework.Catalogs.Roslyn/RoslynPluginCatalog.cs",
"chars": 4158,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Task"
},
{
"path": "src/Weikio.PluginFramework.Catalogs.Roslyn/RoslynPluginCatalogOptions.cs",
"chars": 1931,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Weikio.PluginFramework.Abstractions;\n\nna"
},
{
"path": "src/Weikio.PluginFramework.Catalogs.Roslyn/ScriptInitializer.cs",
"chars": 8835,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing Sy"
},
{
"path": "src/Weikio.PluginFramework.Catalogs.Roslyn/Weikio.PluginFramework.Catalogs.Roslyn.csproj",
"chars": 1642,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>\n "
},
{
"path": "src/Weikio.PluginFramework.Configuration/CatalogConfiguration.cs",
"chars": 347,
"preview": "namespace Weikio.PluginFramework.Configuration\n{\n /// <summary>\n /// Base configuration class for catalogs.\n //"
},
{
"path": "src/Weikio.PluginFramework.Configuration/Converters/AssemblyCatalogConfigurationCoverter.cs",
"chars": 828,
"preview": "using System;\nusing Microsoft.Extensions.Configuration;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio.PluginFr"
},
{
"path": "src/Weikio.PluginFramework.Configuration/Converters/FolderCatalogConfigurationConverter.cs",
"chars": 1549,
"preview": "using System;\nusing System.Collections.Generic;\nusing Microsoft.Extensions.Configuration;\nusing Weikio.PluginFramework.A"
},
{
"path": "src/Weikio.PluginFramework.Configuration/Converters/IConfigurationToCatalogConverter.cs",
"chars": 1019,
"preview": "using Microsoft.Extensions.Configuration;\nusing Weikio.PluginFramework.Abstractions;\n\nnamespace Weikio.PluginFramework.C"
},
{
"path": "src/Weikio.PluginFramework.Configuration/Providers/IPluginCatalogConfigurationLoader.cs",
"chars": 876,
"preview": "using System.Collections.Generic;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Weikio.PluginFramework.Configurat"
},
{
"path": "src/Weikio.PluginFramework.Configuration/Providers/PluginCatalogConfigurationLoader.cs",
"chars": 1152,
"preview": "using System.Collections.Generic;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Options;\nusing We"
},
{
"path": "src/Weikio.PluginFramework.Configuration/Weikio.PluginFramework.Configuration.csproj",
"chars": 1221,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>\n "
},
{
"path": "tests/Assemblies/JsonNetNew/JsonNetNew.csproj",
"chars": 425,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "tests/Assemblies/JsonNetNew/NewJsonResolver.cs",
"chars": 306,
"preview": "using Newtonsoft.Json;\nusing TestIntefaces;\n\nnamespace JsonNetNew\n{\n public class NewJsonResolver : IJsonVersionReso"
},
{
"path": "tests/Assemblies/JsonNetOld/JsonNetOld.csproj",
"chars": 497,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "tests/Assemblies/JsonNetOld/OldJsonResolver.cs",
"chars": 674,
"preview": "using System;\nusing Newtonsoft.Json;\nusing TestIntefaces;\n\nnamespace JsonNetOld\n{\n public class OldJsonResolver : IJ"
},
{
"path": "tests/Assemblies/TestAssembly1/FirstPlugin.cs",
"chars": 192,
"preview": "using TestIntefaces;\n\nnamespace TestAssembly1\n{\n public class FirstPlugin : ICommand\n {\n public string Run"
},
{
"path": "tests/Assemblies/TestAssembly1/INotPluginInterface.cs",
"chars": 91,
"preview": "namespace TestAssembly1\n{\n public interface INotPluginInterface\n {\n \n }\n}\n"
},
{
"path": "tests/Assemblies/TestAssembly1/NotAPlugin.cs",
"chars": 87,
"preview": "namespace TestAssembly1\n{\n public abstract class NotAPlugin\n {\n \n }\n}\n"
},
{
"path": "tests/Assemblies/TestAssembly1/TestAssembly1.csproj",
"chars": 315,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "tests/Assemblies/TestAssembly2/SecondPlugin.cs",
"chars": 95,
"preview": "using System;\n\nnamespace TestAssembly2\n{\n public class SecondPlugin\n {\n \n }\n}\n"
},
{
"path": "tests/Assemblies/TestAssembly2/TestAssembly2.csproj",
"chars": 213,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "tests/Assemblies/TestAssembly3/TestAssembly3.csproj",
"chars": 317,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "tests/Assemblies/TestAssembly3/ThirdAddon.cs",
"chars": 102,
"preview": "using TestIntefaces;\n\nnamespace TestAssembly3\n{\n public class ThirdAddon : ICommand\n {\n }\n}\n"
},
{
"path": "tests/Assemblies/TestIntefaces/ICommand.cs",
"chars": 86,
"preview": "using System;\n\nnamespace TestIntefaces\n{\n public interface ICommand\n {\n }\n}\n"
},
{
"path": "tests/Assemblies/TestIntefaces/IJsonVersionResolver.cs",
"chars": 112,
"preview": "namespace TestIntefaces\n{\n public interface IJsonVersionResolver\n {\n string GetVersion();\n }\n}\n"
},
{
"path": "tests/Assemblies/TestIntefaces/TestIntefaces.csproj",
"chars": 214,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netstandard2.0</TargetFramework>\n </PropertyG"
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/Controllers/WeatherForecastController.cs",
"chars": 1139,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNet"
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/PluginFrameworkTestBed.csproj",
"chars": 150,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n "
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/Program.cs",
"chars": 704,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetC"
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/Startup.cs",
"chars": 1423,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetC"
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/WeatherForecast.cs",
"chars": 304,
"preview": "using System;\n\nnamespace PluginFrameworkTestBed\n{\n public class WeatherForecast\n {\n public DateTime Date { "
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/appsettings.Development.json",
"chars": 159,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "tests/integration/WebSites/PluginFrameworkTestBed/appsettings.json",
"chars": 182,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft\": \"Warning\",\n \"Microsoft.Hostin"
},
{
"path": "tests/integration/Weikio.PluginFramework.AspNetCore.IntegrationTests/DefaultPluginTypeTests.cs",
"chars": 2141,
"preview": "using System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.AspNetCore.Mvc.Testing;\nusing Microsoft.Extensions"
},
{
"path": "tests/integration/Weikio.PluginFramework.AspNetCore.IntegrationTests/TestBase.cs",
"chars": 1876,
"preview": "using System;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Mvc.Testing;\nusing Microsoft.Extensions.De"
},
{
"path": "tests/integration/Weikio.PluginFramework.AspNetCore.IntegrationTests/Weikio.PluginFramework.AspNetCore.IntegrationTests.csproj",
"chars": 1448,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n </Pr"
},
{
"path": "tests/integration/Weikio.PluginFramework.AspNetCore.IntegrationTests/xunit.runner.json",
"chars": 26,
"preview": "{\n \"shadowCopy\": false\n}\n"
},
{
"path": "tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NotThreadSafeResourceCollection.cs",
"chars": 218,
"preview": "using Xunit;\n\nnamespace PluginFramework.Catalogs.NuGet.Tests\n{\n [CollectionDefinition(nameof(NotThreadSafeResourceCo"
},
{
"path": "tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NuGet.Config",
"chars": 207,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n <packageSources>\n <add key=\"nuget.org_test\" value=\"https://a"
},
{
"path": "tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetFeedPluginCatalogTests.cs",
"chars": 4756,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Versioning;\nusing System"
},
{
"path": "tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/NugetPackagePluginCatalogTests.cs",
"chars": 12202,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing Syste"
},
{
"path": "tests/integration/Weikio.PluginFramework.Catalogs.NuGet.Tests/Weikio.PluginFramework.Catalogs.NuGet.Tests.csproj",
"chars": 702,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n </PropertyGr"
},
{
"path": "tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/RegularInitializerTests.cs",
"chars": 3061,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Threading.Tasks;\nusing Xunit;\n\nna"
},
{
"path": "tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/RoslynPluginCatalogTests.cs",
"chars": 10937,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Threading.Tas"
},
{
"path": "tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/ScriptInitializerTests.cs",
"chars": 10761,
"preview": "using System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Xunit;\n\nnamespace Weikio.PluginFramework.Catalogs."
},
{
"path": "tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/TestHelpers.cs",
"chars": 1479,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Compil"
},
{
"path": "tests/unit/Weikio.PluginFramework.Catalogs.Roslyn.Tests/Weikio.PluginFramework.Catalogs.Roslyn.Tests.csproj",
"chars": 605,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>netcoreapp3.1</TargetFramework>\n </PropertyG"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/AssemblyPluginCatalogTests.cs",
"chars": 10148,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Task"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/DefaultOptionsTests.cs",
"chars": 1849,
"preview": "using System;\nusing System.Threading.Tasks;\nusing Weikio.PluginFramework.Abstractions;\nusing Weikio.PluginFramework.Cat"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/DelegateCatalogTests.cs",
"chars": 15576,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Threading.Task"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/FolderCatalogTests.cs",
"chars": 8295,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing Syst"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/NotThreadSafeResourceCollection.cs",
"chars": 218,
"preview": "using Xunit;\n\nnamespace Weikio.PluginFramework.Tests\n{\n [CollectionDefinition(nameof(NotThreadSafeResourceCollection"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/Plugins/AbstractPluginWithAttribute.cs",
"chars": 142,
"preview": "namespace Weikio.PluginFramework.Tests.Plugins\n{\n [MyPlugin]\n public abstract class AbstractPluginWithAttribute\n "
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/Plugins/AnotherPluginWithAttribute.cs",
"chars": 131,
"preview": "namespace Weikio.PluginFramework.Tests.Plugins\n{\n [MyPlugin]\n public class AnotherPluginWithAttribute\n {\n "
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/Plugins/MyPluginAttribute.cs",
"chars": 180,
"preview": "using System;\n\nnamespace Weikio.PluginFramework.Tests.Plugins\n{\n [AttributeUsage(AttributeTargets.Class)]\n public"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/Plugins/PluginWithAttribute.cs",
"chars": 124,
"preview": "namespace Weikio.PluginFramework.Tests.Plugins\n{\n [MyPlugin]\n public class PluginWithAttribute\n {\n \n "
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/Plugins/TypePlugin.cs",
"chars": 92,
"preview": "namespace Weikio.PluginFramework.Tests.Plugins\n{\n public class TypePlugin\n {\n }\n}\n"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/Plugins/TypePluginWithName.cs",
"chars": 164,
"preview": "using System.ComponentModel;\n\nnamespace Weikio.PluginFramework.Tests.Plugins\n{\n [DisplayName(\"MyCustomName\")]\n pu"
},
{
"path": "tests/unit/Weikio.PluginFramework.Tests/TagTests.cs",
"chars": 7429,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Weikio.PluginFramework.Abstractions"
}
]
// ... and 6 more files (download for full content)
About this extraction
This page contains the full source code of the weikio/PluginFramework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 206 files (403.6 KB), approximately 95.6k tokens, and a symbol index with 539 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.