diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..013544f4
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,220 @@
+# http://editorconfig.org/
+
+root = true
+
+[*]
+indent_style = tab
+insert_final_newline = true
+
+# Build scripts
+[*.{yml,yaml}]
+indent_style = spaces
+indent_size = 2
+
+# XML project files
+[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj,props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
+indent_size = 2
+
+# Code files
+[*.cs]
+indent_size = 4
+tab_width = 4
+charset = utf-8-bom
+
+## Dotnet code style settings:
+
+# Sort using and Import directives with System.* appearing first
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = false
+
+# require accessibility modifiers
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:error
+
+# Avoid "this." and "Me." if not necessary
+dotnet_style_qualification_for_field = false:refactoring
+dotnet_style_qualification_for_property = false:refactoring
+dotnet_style_qualification_for_method = false:refactoring
+dotnet_style_qualification_for_event = false:refactoring
+
+# Use language keywords instead of framework type names for type references
+dotnet_style_predefined_type_for_locals_parameters_members = true:error
+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_style_prefer_compound_assignment = true:warning
+
+# Constants are PascalCase
+dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants
+dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style
+
+dotnet_naming_symbols.constants.applicable_kinds = field, local
+dotnet_naming_symbols.constants.required_modifiers = const
+
+dotnet_naming_style.constant_style.capitalization = pascal_case
+
+# Non-private readonly fields are PascalCase
+dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.symbols = non_private_readonly_fields
+dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.style = non_private_readonly_field_style
+
+dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field
+dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected
+dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly
+
+dotnet_naming_style.non_private_readonly_field_style.capitalization = pascal_case
+
+# Non-private static fields are PascalCase
+dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields
+dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style
+
+dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field
+dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected
+dotnet_naming_symbols.non_private_static_fields.required_modifiers = static
+
+dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case
+
+# Static fields are PascalCase
+dotnet_naming_rule.static_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.static_fields_should_be_pascal_case.symbols = static_fields
+dotnet_naming_rule.static_fields_should_be_pascal_case.style = static_field_style
+
+dotnet_naming_symbols.static_fields.applicable_kinds = field
+dotnet_naming_symbols.static_fields.required_modifiers = static
+
+dotnet_naming_style.static_field_style.capitalization = pascal_case
+
+# Instance fields are camelCase and start with _
+dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion
+dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields
+dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style
+
+dotnet_naming_symbols.instance_fields.applicable_kinds = field
+
+dotnet_naming_style.instance_field_style.capitalization = camel_case
+dotnet_naming_style.instance_field_style.required_prefix = _
+
+# Locals and parameters are camelCase
+dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion
+dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters
+dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style
+
+dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local
+
+dotnet_naming_style.camel_case_style.capitalization = camel_case
+
+# Local functions are PascalCase
+dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions
+dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style
+
+dotnet_naming_symbols.local_functions.applicable_kinds = local_function
+
+dotnet_naming_style.local_function_style.capitalization = pascal_case
+
+# By default, name items with PascalCase
+dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members
+dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style
+
+dotnet_naming_symbols.all_members.applicable_kinds = *
+
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+## C# style settings:
+
+# 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
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = false
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+
+# Prefer "var" everywhere
+csharp_style_var_for_built_in_types = true:suggestion
+csharp_style_var_when_type_is_apparent = true:suggestion
+csharp_style_var_elsewhere = true:suggestion
+
+# 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 local method constructs to have a block body
+csharp_style_expression_bodied_local_functions = true:suggestion
+
+# Prefer property-like constructs to have an expression-body
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+
+# Suggest more modern language features when available
+csharp_style_pattern_matching_over_is_with_cast_check = true:warning
+csharp_style_pattern_matching_over_as_with_null_check = true:warning
+csharp_style_inlined_variable_declaration = true:warning
+csharp_style_throw_expression = true:warning
+csharp_style_conditional_delegate_call = true:warning
+csharp_style_prefer_switch_expression = true:warning
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_style_namespace_declarations = file_scoped:error
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = do_not_ignore
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Blocks are allowed
+csharp_prefer_braces = when_multiline:silent
+csharp_preserve_single_line_blocks = true:silent
+csharp_preserve_single_line_statements = true:silent
+
+# Style Analytics
+dotnet_analyzer_diagnostic.category-Style.severity = warning
+
+# XML Documentation
+dotnet_diagnostic.CS0105.severity = none # CS0105: Using directive is unnecessary.
+dotnet_diagnostic.CS1573.severity = none # CS1573: Missing XML comment for parameter
+dotnet_diagnostic.CS1591.severity = none # CS1591: Missing XML comment for publicly visible type or member
+dotnet_diagnostic.CS1712.severity = none # CS1712: Type parameter has no matching typeparam tag in the XML comment (but other type parameters do)
+
+# Async
+dotnet_diagnostic.CS1998.severity = error # CS1998: Async method lacks 'await' operators and will run synchronously
+dotnet_diagnostic.CS4014.severity = error # CS4014: Because this call is not awaited, execution of the current method continues before the call is completed
+
+# Dispose things need disposing
+dotnet_diagnostic.CA2000.severity = error # CA2000: Dispose objects before losing scope
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..6313b56c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..a948102e
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "nuget"
+ directory: "/"
+ schedule:
+ interval: weekly
+ rebase-strategy: auto
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..71356f93
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,36 @@
+name: Build
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - 'master'
+ paths-ignore:
+ - '**/readme.md'
+ pull_request:
+ types: [opened, synchronize, reopened]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
+
+ - name: Restore dependencies
+ run: dotnet restore
+ - name: Build
+ run: dotnet build -c Release --no-restore
+ - name: Test
+ run: dotnet test -c Release --no-build --logger GitHubActions
+
+ - name: Upload coverage reports to Codecov with GitHub Action
+ uses: codecov/codecov-action@v3
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..0b3fe8c7
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,41 @@
+name: Release
+
+on:
+ workflow_dispatch:
+ push:
+ tags:
+ - '**'
+
+permissions:
+ contents: write
+
+jobs:
+ release:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: |
+ 6.0.x
+ 8.0.x
+
+ - name: Restore dependencies
+ run: dotnet restore
+ - name: Build
+ run: dotnet build -c Release --no-restore
+
+ - name: Package
+ run: dotnet pack -c Release --no-build --property:PackageOutputPath=../../nupkgs
+ - name: Push to Nuget
+ run: dotnet nuget push "./nupkgs/*.nupkg" --source "https://api.nuget.org/v3/index.json" --api-key ${{ secrets.NUGETPUBLISHKEY }}
+
+ - name: Create Release
+ uses: ncipollo/release-action@v1
+ with:
+ generateReleaseNotes: 'true'
+ makeLatest: 'true'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..482bf54b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+### VisualStudio ###
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# Build results
+[Bb]in/
+[Oo]bj/
+
+# Visual Studio cache/options directory
+.vs/
+*.user
+
+# VS Code cache/options directory
+.vscode/
+
+# TestResults
+[Tt]est[Rr]esults/
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 00000000..62c6f907
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,29 @@
+
+
+ latest
+
+ enable
+ $(WarningsAsErrors);nullable;
+
+ enable
+
+ latest-all
+ true
+
+ true
+
+
+
+
+
+
+
+
+ true
+
+ true
+ true
+ true
+ opencover
+
+
diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 00000000..74b6482e
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,20 @@
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Immediate.Handlers.sln b/Immediate.Handlers.sln
new file mode 100644
index 00000000..7d815764
--- /dev/null
+++ b/Immediate.Handlers.sln
@@ -0,0 +1,72 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".root", ".root", "{E83E02F9-5BD8-426B-ABE0-111129CDE5C2}"
+ ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
+ .gitignore = .gitignore
+ .github\dependabot.yml = .github\dependabot.yml
+ Directory.Build.props = Directory.Build.props
+ Directory.Packages.props = Directory.Packages.props
+ readme.md = readme.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{48400D35-471A-4EF4-93E4-2394D87E0012}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{517768B6-A2B3-4ED2-8F70-E53C85A493FF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{E0B0FA04-0B70-40E7-B982-8702A7829DC7}"
+ ProjectSection(SolutionItems) = preProject
+ .github\workflows\build.yml = .github\workflows\build.yml
+ .github\workflows\release.yml = .github\workflows\release.yml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{C484CFC6-6DB0-48CB-A769-1A06FF40787E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Immediate.Handlers", "src\Immediate.Handlers\Immediate.Handlers.csproj", "{4E9DC4CB-4833-4471-AF34-699565BCFDBE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Immediate.Handlers.Utility", "src\Immediate.Handlers.Utility\Immediate.Handlers.Utility.csproj", "{789B0C8D-98ED-4712-8AB1-E4B10AD4D669}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Immediate.Handlers.Samples", "samples\Immediate.Handlers.Samples\Immediate.Handlers.Samples.csproj", "{47F6A643-1381-4B43-9F7B-689DFB037637}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Immediate.Handlers.Tests", "tests\Immediate.Handlers.Tests\Immediate.Handlers.Tests.csproj", "{7E5E76EB-8087-48F6-8A87-CFABFC5CB409}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4E9DC4CB-4833-4471-AF34-699565BCFDBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4E9DC4CB-4833-4471-AF34-699565BCFDBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4E9DC4CB-4833-4471-AF34-699565BCFDBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4E9DC4CB-4833-4471-AF34-699565BCFDBE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {789B0C8D-98ED-4712-8AB1-E4B10AD4D669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {789B0C8D-98ED-4712-8AB1-E4B10AD4D669}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {789B0C8D-98ED-4712-8AB1-E4B10AD4D669}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {789B0C8D-98ED-4712-8AB1-E4B10AD4D669}.Release|Any CPU.Build.0 = Release|Any CPU
+ {47F6A643-1381-4B43-9F7B-689DFB037637}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {47F6A643-1381-4B43-9F7B-689DFB037637}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {47F6A643-1381-4B43-9F7B-689DFB037637}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {47F6A643-1381-4B43-9F7B-689DFB037637}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7E5E76EB-8087-48F6-8A87-CFABFC5CB409}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7E5E76EB-8087-48F6-8A87-CFABFC5CB409}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7E5E76EB-8087-48F6-8A87-CFABFC5CB409}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7E5E76EB-8087-48F6-8A87-CFABFC5CB409}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {4E9DC4CB-4833-4471-AF34-699565BCFDBE} = {48400D35-471A-4EF4-93E4-2394D87E0012}
+ {789B0C8D-98ED-4712-8AB1-E4B10AD4D669} = {48400D35-471A-4EF4-93E4-2394D87E0012}
+ {E0B0FA04-0B70-40E7-B982-8702A7829DC7} = {E83E02F9-5BD8-426B-ABE0-111129CDE5C2}
+ {47F6A643-1381-4B43-9F7B-689DFB037637} = {C484CFC6-6DB0-48CB-A769-1A06FF40787E}
+ {7E5E76EB-8087-48F6-8A87-CFABFC5CB409} = {517768B6-A2B3-4ED2-8F70-E53C85A493FF}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {184E3CAB-91E8-4F1A-A16B-C062F25BECC4}
+ EndGlobalSection
+EndGlobal
diff --git a/license.txt b/license.txt
new file mode 100644
index 00000000..1d8db7a3
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2024 Immediate.Handlers developers
+
+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.
diff --git a/readme.md b/readme.md
new file mode 100644
index 00000000..eef4400b
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,12 @@
+# Immediate.Handlers
+| Name | Status | History |
+| :--- | :--- | :--- |
+| GitHub Actions | ![Build](https://github.com/viceroypenguin/Immediate.Handlers/actions/workflows/build.yml/badge.svg) | [![GitHub Actions Build History](https://buildstats.info/github/chart/viceroypenguin/Immediate.Handlers?branch=master&includeBuildsFromPullRequest=false)](https://github.com/viceroypenguin/Immediate.Handlers/actions) |
+
+[![NuGet](https://img.shields.io/nuget/v/Immediate.Handlers.svg?style=plastic)](https://www.nuget.org/packages/Immediate.Handlers/)
+[![GitHub release](https://img.shields.io/github/release/viceroypenguin/Immediate.Handlers.svg)](https://GitHub.com/viceroypenguin/Immediate.Handlers/releases/)
+[![GitHub license](https://img.shields.io/github/license/viceroypenguin/Immediate.Handlers.svg)](https://github.com/viceroypenguin/Immediate.Handlers/blob/master/license.txt)
+[![GitHub issues](https://img.shields.io/github/issues/viceroypenguin/Immediate.Handlers.svg)](https://GitHub.com/viceroypenguin/Immediate.Handlers/issues/)
+[![GitHub issues-closed](https://img.shields.io/github/issues-closed/viceroypenguin/Immediate.Handlers.svg)](https://GitHub.com/viceroypenguin/Immediate.Handlers/issues?q=is%3Aissue+is%3Aclosed)
+---
+
diff --git a/samples/Normal/Normal.csproj b/samples/Normal/Normal.csproj
new file mode 100644
index 00000000..397d8c21
--- /dev/null
+++ b/samples/Normal/Normal.csproj
@@ -0,0 +1,12 @@
+
+
+
+ net6.0;net8.0
+ false
+
+
+
+
+
+
+
diff --git a/src/Immediate.Handlers.Utility/Immediate.Handlers.Utility.csproj b/src/Immediate.Handlers.Utility/Immediate.Handlers.Utility.csproj
new file mode 100644
index 00000000..8a960fe0
--- /dev/null
+++ b/src/Immediate.Handlers.Utility/Immediate.Handlers.Utility.csproj
@@ -0,0 +1,8 @@
+
+
+
+ netstandard2.0
+ false
+
+
+
diff --git a/src/Immediate.Handlers/Immediate.Handlers.csproj b/src/Immediate.Handlers/Immediate.Handlers.csproj
new file mode 100644
index 00000000..c6c6610d
--- /dev/null
+++ b/src/Immediate.Handlers/Immediate.Handlers.csproj
@@ -0,0 +1,51 @@
+
+
+
+ netstandard2.0
+ false
+ true
+ true
+
+
+
+ Immediate.Handlers
+ TBD
+
+ Immediate.Handlers Developers
+
+ MIT
+ readme.md
+
+ true
+ https://github.com/viceroypenguin/Immediate.Handlers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ minor
+ preview.0
+ v
+
+
+
diff --git a/src/Immediate.Handlers/Properties/launchSettings.json b/src/Immediate.Handlers/Properties/launchSettings.json
new file mode 100644
index 00000000..f3158850
--- /dev/null
+++ b/src/Immediate.Handlers/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Immediate.Handlers.Samples": {
+ "commandName": "DebugRoslynComponent",
+ "targetProject": "..//..//Samples//Immediate.Handlers.Samples//Immediate.Handlers.Samples.csproj"
+ }
+ }
+}
diff --git a/tests/Immediate.Handlers.Tests/Immediate.Handlers.Tests.csproj b/tests/Immediate.Handlers.Tests/Immediate.Handlers.Tests.csproj
new file mode 100644
index 00000000..338075ec
--- /dev/null
+++ b/tests/Immediate.Handlers.Tests/Immediate.Handlers.Tests.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net6.0;net8.0
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+