diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6a79a4d..e93b9ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,110 +1,16 @@ -name: CI +name: verify on: push: - branches-ignore: - - dependabot/* pull_request: - workflow_dispatch: - inputs: - is_stable_build: - description: Use a version number indicating this is a stable release - required: true - default: "false" - release: - description: Create a release - required: true - default: "false" - -env: - IS_STABLE_BUILD: ${{ github.event.inputs.is_stable_build }} jobs: - build: - if: "!contains(github.event.head_commit.message, 'ci skip') || github.event_name == 'workflow_dispatch'" - strategy: - fail-fast: false - matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - - runs-on: ${{ matrix.os }} - - # Windows builds are failing 100% of the time on code that works just fine on Linux - # and works 90% of the time on the macOS build agents GitHub uses and works 100% of the time on my - # my laptop. Life is short. I'm not spending more time trying to figure out why the code that used - # to work create on .NET 5 became flaky on newer versions of .NET but only on some platforms. - continue-on-error: ${{ matrix.os != 'ubuntu-latest' }} - - outputs: - package_version: ${{ steps.build_script.outputs.package_version }} - - steps: - - uses: actions/checkout@v4 - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 8 - - name: Run build script - id: build_script - run: ./build.ps1 -ci - - uses: actions/upload-artifact@v4 - if: ${{ matrix.os == 'ubuntu-latest' }} - with: - name: packages - path: artifacts/ - if-no-files-found: error - - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - name: unittests-${{ matrix.os }} - fail_ci_if_error: true - release: - if: "github.event.inputs.release" - needs: build + test: runs-on: ubuntu-latest - permissions: - contents: write - id-token: write - packages: write - env: - PACKAGE_VERSION: ${{ needs.build.outputs.package_version }} steps: - - run: echo "Releasing ${{ env.PACKAGE_VERSION }}" - - uses: actions/download-artifact@v4 - with: - name: packages - path: packages - - name: Configure GitHub NuGet registry - run: dotnet nuget add source --name github --username ${{ github.repository_owner }} --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json - - name: Push to GitHub package registry - run: dotnet nuget push packages/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source github --skip-duplicate - - name: Login to NuGet.org - id: nuget-login - uses: nuget/login@v1 + - uses: actions/checkout@v7 + - uses: actions/setup-dotnet@v6 with: - user: natemcmaster - - name: Push to NuGet.org - run: dotnet nuget push packages/*.nupkg --api-key ${{ steps.nuget-login.outputs.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate - - name: Create GitHub release - uses: softprops/action-gh-release@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - name: ${{ env.PACKAGE_VERSION }} - tag_name: v${{ env.PACKAGE_VERSION }} - body: | - ## Notes - - ## How to get this update - Packages have been posted to these feeds: - - #### NuGet.org - https://nuget.org/packages/McMaster.NETCore.Plugins/${{ env.PACKAGE_VERSION }} - https://nuget.org/packages/McMaster.NETCore.Plugins.Mvc/${{ env.PACKAGE_VERSION }} - - #### GitHub Package Registry - https://github.com/natemcmaster?tab=packages&repo_name=DotNetCorePlugins - - draft: true - prerelease: ${{ env.IS_STABLE_BUILD == 'false' }} # Example: v3.1.0-beta - files: packages/* + dotnet-version: '10.0.x' + - name: 跑断言 + run: dotnet test test/Hosihikari.Tests/Hosihikari.McMaster.NETCore.Plugins.Tests.csproj -c Release --nologo diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..57b8dec --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,56 @@ +name: publish + +on: + push: + tags: ['v*'] + workflow_dispatch: + +jobs: + nuget: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write # 换 OIDC 令牌(Trusted Publishing) + + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-dotnet@v6 + with: + dotnet-version: '10.0.x' + + # 标签与包版本漂了就在构建前停下。 + - name: 版本一致 + if: startsWith(github.ref, 'refs/tags/') + shell: pwsh + run: | + $tag = '${{ github.ref_name }}' -replace '^v', '' + $version = dotnet msbuild src/Plugins/McMaster.NETCore.Plugins.csproj -getProperty:PackageVersion + if ($version -ne $tag) { throw "PackageVersion 是 $version,标签是 $tag" } + + # 版本号的事实源是 csproj 里的 ,标签只是触发器。 + - name: 打包 + run: dotnet pack src/Plugins/McMaster.NETCore.Plugins.csproj -c Release -o out + + # 用 OIDC 令牌换一把临时 API key —— 仓库里不存任何长期密钥。 + # 换来的 key 只有一小时有效期、且一个令牌只能换一把,所以这一步紧贴推送。 + - name: 换临时 API key + uses: NuGet/login@v1 + id: login + with: + # nuget.org 的用户名(profile name),不是邮箱。 + user: ${{ secrets.NUGET_USER }} + + - name: 推送 + run: > + dotnet nuget push out/*.nupkg + --api-key ${{ steps.login.outputs.NUGET_API_KEY }} + --source https://api.nuget.org/v3/index.json + --skip-duplicate + + - name: 推送符号 + run: > + dotnet nuget push out/*.snupkg + --api-key ${{ steps.login.outputs.NUGET_API_KEY }} + --source https://api.nuget.org/v3/index.json + --skip-duplicate diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 9237e4d..9d4a5ac 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -13,7 +13,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v9 + - uses: actions/stale@v11 with: debug-only: ${{ github.event.inputs.debug-only == 'true' }} days-before-stale: 365 diff --git a/.gitignore b/.gitignore index bbe7087..4f5ca64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ bin/ obj/ +.build/ .vs/ artifacts/ .idea/ diff --git a/CLAUDE.md b/CLAUDE.md index 8f44d8f..0001f40 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -DotNetCorePlugins is a .NET library for dynamically loading .NET assemblies as plugins with fine-grained control over assembly isolation and type sharing. Version 2.0+ targets .NET 8.0. +DotNetCorePlugins is a .NET library for dynamically loading .NET assemblies as plugins with fine-grained control over assembly isolation and type sharing. This is the Hosihikari fork (see [FORK.md](FORK.md)); it targets .NET 10. ## Build Commands @@ -18,7 +18,7 @@ pwsh ./build.ps1 -ci # Individual commands dotnet format # Code formatting dotnet build # Build all projects -dotnet test test/Plugins.Tests # Run tests +dotnet test test/Hosihikari.Tests -c Release # RID probe tests dotnet pack -o artifacts/ # Create NuGet packages ``` @@ -48,6 +48,9 @@ Include `[ci skip]` in a commit message to skip CI builds. - `test/Plugins.Tests/`: xUnit tests - `test/TestProjects/`: 30+ test assemblies for various plugin scenarios +- `test/Hosihikari.Tests/`: the RID-specific native probe + +Upstream `samples/` is not carried in this fork. ## Code Conventions diff --git a/DotNetCorePlugins.sln b/DotNetCorePlugins.sln index 16e7b90..ed1921d 100644 --- a/DotNetCorePlugins.sln +++ b/DotNetCorePlugins.sln @@ -1,817 +1,62 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.9.34622.214 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{471CA3C0-0BC9-4C0C-A013-D9356DBD0F38}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "McMaster.NETCore.Plugins", "src\Plugins\McMaster.NETCore.Plugins.csproj", "{2D251CFD-A9DA-421F-B516-B25873348C08}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{69958BAA-5D54-4F3F-82D6-F622F9491057}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "McMaster.NETCore.Plugins.Tests", "test\Plugins.Tests\McMaster.NETCore.Plugins.Tests.csproj", "{00D7FBF0-801B-4B0E-9FDD-5C367E71444B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestProjects", "TestProjects", "{98E964A2-55DA-4740-9F2E-B64FDF6715DB}" - ProjectSection(SolutionItems) = preProject - test\TestProjects\Directory.Build.props = test\TestProjects\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetCoreApp2App", "test\TestProjects\NetCoreApp2App\NetCoreApp2App.csproj", "{B9C61145-C010-4FAA-B9EA-4D1AEE20305F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetStandardClassLib", "test\TestProjects\NetStandardClassLib\NetStandardClassLib.csproj", "{4FDB7710-F4CA-45FB-9514-A4D288EDA44A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReferencedLibv1", "test\TestProjects\ReferencedLibv1\ReferencedLibv1.csproj", "{CC37B369-BA9E-4B82-A14D-68B58924885D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReferencedLibv2", "test\TestProjects\ReferencedLibv2\ReferencedLibv2.csproj", "{50F86C8F-E052-448C-84CE-08763945FCC7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XunitSample", "test\TestProjects\XunitSample\XunitSample.csproj", "{3CEF9F32-5887-4977-AB8A-1BBC48875A21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Banana", "test\TestProjects\Banana\Banana.csproj", "{8797AFCA-1EE8-4270-8FC4-F93A85F9C825}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Strawberry", "test\TestProjects\Strawberry\Strawberry.csproj", "{78D2B20D-B173-4CF2-A763-F2AA5347947E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerShellPlugin", "test\TestProjects\PowerShellPlugin\PowerShellPlugin.csproj", "{C0BA460C-C1AC-4C54-9C88-60E4B8681E94}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9E47E94A-3F50-4B3B-8937-1FCF832ABEB6}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - .gitignore = .gitignore - build.ps1 = build.ps1 - src\common.psm1 = src\common.psm1 - Directory.Build.props = Directory.Build.props - src\Directory.Build.targets = src\Directory.Build.targets - LICENSE.txt = LICENSE.txt - README.md = README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plátano", "test\TestProjects\Plátano\Plátano.csproj", "{5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DrawingApp", "test\TestProjects\DrawingApp\DrawingApp.csproj", "{8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlClientApp", "test\TestProjects\SqlClientApp\SqlClientApp.csproj", "{0CDA2765-C9DF-45EE-A099-0E2D4A980E59}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MvcApp", "samples\aspnetcore-mvc\MvcApp\MvcApp.csproj", "{F934B760-4847-4BA8-9F6A-7F750ECF2328}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MvcAppPlugin1", "samples\aspnetcore-mvc\MvcAppPlugin1\MvcAppPlugin1.csproj", "{2DC38785-B7B6-49E9-84D4-103A56D3604A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{F49FFE3B-E1AE-483E-951F-D498F6ABA08E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnetcoremvc", "aspnetcoremvc", "{610E8065-1F29-41E8-A3FC-07ABDF16C8BB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "McMaster.NETCore.Plugins.Mvc", "src\Plugins.Mvc\McMaster.NETCore.Plugins.Mvc.csproj", "{263CD320-FAC5-4F0C-8FFB-788DD3C455D4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnetcore", "aspnetcore", "{DD87D202-998B-4C20-8D68-C769797D7761}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Abstractions", "samples\aspnetcore\Abstractions\Abstractions.csproj", "{D1E1AEDC-4870-4863-A8D3-B6A184E651C1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MainWebApp", "samples\aspnetcore\MainWebApp\MainWebApp.csproj", "{7DD1722B-B971-4322-BA74-C622E808B84D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebAppPlugin1", "samples\aspnetcore\WebAppPlugin1\WebAppPlugin1.csproj", "{A4C90265-C922-4145-8CDC-82EC5EBBC3A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebAppPlugin2", "samples\aspnetcore\WebAppPlugin2\WebAppPlugin2.csproj", "{ADF569DC-E916-4F39-8ABF-8AA42F69266E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hello-world", "hello-world", "{3B0C6936-E777-4413-B68A-1686A768F928}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HostApp", "samples\hello-world\HostApp\HostApp.csproj", "{DFC13FA1-509C-42AF-870F-543C7A3F231B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyPlugin", "samples\hello-world\MyPlugin\MyPlugin.csproj", "{2573526D-A764-4507-B2F6-1A2BF7A3FA93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PluginContract", "samples\hello-world\PluginContract\PluginContract.csproj", "{6842C9FD-6720-43EA-83AD-DE315531DDA9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependency-injection", "dependency-injection", "{D17C19AC-EC11-4661-BD23-DC8308CF71C0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DI.HostApp", "samples\dependency-injection\DI.HostApp\DI.HostApp.csproj", "{5DBEE6E0-8744-46E4-B711-8FEC98D41A50}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyPlugin1", "samples\dependency-injection\MyPlugin1\MyPlugin1.csproj", "{BF78F36A-D072-4F1C-89B1-73D9C208ABB3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyPlugin2", "samples\dependency-injection\MyPlugin2\MyPlugin2.csproj", "{4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DI.SharedAbstractions", "samples\dependency-injection\DI.SharedAbstractions\DI.SharedAbstractions.csproj", "{40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TransitiveDep.v2", "test\TestProjects\TransitiveDep.v2\TransitiveDep.v2.csproj", "{CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharedAbstraction.v1", "test\TestProjects\SharedAbstraction.v1\SharedAbstraction.v1.csproj", "{D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TransitiveDep.v1", "test\TestProjects\TransitiveDep.v1\TransitiveDep.v1.csproj", "{704EA4BF-71D9-442B-96D9-9B3E81068CC2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharedAbstraction.v2", "test\TestProjects\SharedAbstraction.v2\SharedAbstraction.v2.csproj", "{3549E707-E4B0-428F-9CF4-5B5B86219B6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TransitivePlugin", "test\TestProjects\TransitivePlugin\TransitivePlugin.csproj", "{1EA2BACF-3D44-4B05-A0E7-727AE13E693D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hot-reload", "hot-reload", "{07E0093F-F05C-4AED-A489-1254C9854E21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HotReloadApp", "samples\hot-reload\HotReloadApp\HotReloadApp.csproj", "{D815817F-CC0D-42CC-9C9C-8E229B9C03A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimestampedPlugin", "samples\hot-reload\TimestampedPlugin\TimestampedPlugin.csproj", "{FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithOwnPlugins", "test\TestProjects\WithOwnPlugins\WithOwnPlugins.csproj", "{F47ED576-F347-44C4-BEC7-6C00A500555A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithOwnPluginsContract", "test\TestProjects\WithOwnPluginsContract\WithOwnPluginsContract.csproj", "{F55E52BD-A846-4808-9482-E4AB0921328D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithOurPluginsPluginContract", "test\TestProjects\WithOurPluginsPluginContract\WithOurPluginsPluginContract.csproj", "{7C7B19F2-5822-4DA2-80D2-E077CE705039}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithOurPluginsPluginA", "test\TestProjects\WithOurPluginsPluginA\WithOurPluginsPluginA.csproj", "{3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WithOurPluginsPluginB", "test\TestProjects\WithOurPluginsPluginB\WithOurPluginsPluginB.csproj", "{D5B3DA06-E60D-4C85-8835-6A26003365AA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeDependency", "test\TestProjects\NativeDependency\NativeDependency.csproj", "{2837A894-11D6-4DBF-B140-84C97C385A15}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dynamic-implementation", "dynamic-implementation", "{10109B62-DACC-42BA-AD8C-73DE4B93841B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Contracts", "samples\dynamic-implementation\Contracts\Contracts.csproj", "{39B9F0B5-3C53-4140-B158-96C67C03E876}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Host", "samples\dynamic-implementation\Host\Host.csproj", "{703ECD55-EF0E-4734-A28E-371EDD213EEF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mixer", "samples\dynamic-implementation\Mixer\Mixer.csproj", "{9E2178A0-5915-4308-B6C3-5C8758A47788}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceImplementation", "samples\dynamic-implementation\ServiceImplementation\ServiceImplementation.csproj", "{39BCFE6F-50C4-45AE-8D13-38FB423AB619}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Libv1", "test\TestProjects\Libv1\Libv1.csproj", "{3761F08D-06AE-4E07-8B88-F19C465DC169}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Libv2", "test\TestProjects\Libv2\Libv2.csproj", "{DB02518A-49A1-4836-80B7-D69A70DE68BA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Libv3", "test\TestProjects\Libv3\Libv3.csproj", "{47C888A8-6887-4FA2-A202-8653684F3651}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrivateDepv1", "test\TestProjects\PrivateDepv1\PrivateDepv1.csproj", "{88691B89-0167-4E90-86F6-5FD6C974F7A3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrivateDepv2", "test\TestProjects\PrivateDepv2\PrivateDepv2.csproj", "{63631241-3CA1-40E2-9545-01E019414E4F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrivateDepv3", "test\TestProjects\PrivateDepv3\PrivateDepv3.csproj", "{0C5BEA9A-9F07-49F5-8E84-80F3250E6516}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2D251CFD-A9DA-421F-B516-B25873348C08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Debug|x64.ActiveCfg = Debug|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Debug|x64.Build.0 = Debug|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Debug|x86.ActiveCfg = Debug|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Debug|x86.Build.0 = Debug|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Release|Any CPU.Build.0 = Release|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Release|x64.ActiveCfg = Release|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Release|x64.Build.0 = Release|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Release|x86.ActiveCfg = Release|Any CPU - {2D251CFD-A9DA-421F-B516-B25873348C08}.Release|x86.Build.0 = Release|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Debug|x64.ActiveCfg = Debug|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Debug|x64.Build.0 = Debug|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Debug|x86.ActiveCfg = Debug|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Debug|x86.Build.0 = Debug|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Release|Any CPU.Build.0 = Release|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Release|x64.ActiveCfg = Release|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Release|x64.Build.0 = Release|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Release|x86.ActiveCfg = Release|Any CPU - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B}.Release|x86.Build.0 = Release|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Debug|x64.Build.0 = Debug|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Debug|x86.ActiveCfg = Debug|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Debug|x86.Build.0 = Debug|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Release|Any CPU.Build.0 = Release|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Release|x64.ActiveCfg = Release|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Release|x64.Build.0 = Release|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Release|x86.ActiveCfg = Release|Any CPU - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F}.Release|x86.Build.0 = Release|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Debug|x64.ActiveCfg = Debug|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Debug|x64.Build.0 = Debug|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Debug|x86.ActiveCfg = Debug|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Debug|x86.Build.0 = Debug|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Release|Any CPU.Build.0 = Release|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Release|x64.ActiveCfg = Release|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Release|x64.Build.0 = Release|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Release|x86.ActiveCfg = Release|Any CPU - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A}.Release|x86.Build.0 = Release|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Debug|x64.ActiveCfg = Debug|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Debug|x64.Build.0 = Debug|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Debug|x86.ActiveCfg = Debug|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Debug|x86.Build.0 = Debug|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Release|Any CPU.Build.0 = Release|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Release|x64.ActiveCfg = Release|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Release|x64.Build.0 = Release|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Release|x86.ActiveCfg = Release|Any CPU - {CC37B369-BA9E-4B82-A14D-68B58924885D}.Release|x86.Build.0 = Release|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Debug|x64.ActiveCfg = Debug|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Debug|x64.Build.0 = Debug|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Debug|x86.ActiveCfg = Debug|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Debug|x86.Build.0 = Debug|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Release|Any CPU.Build.0 = Release|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Release|x64.ActiveCfg = Release|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Release|x64.Build.0 = Release|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Release|x86.ActiveCfg = Release|Any CPU - {50F86C8F-E052-448C-84CE-08763945FCC7}.Release|x86.Build.0 = Release|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Debug|x64.ActiveCfg = Debug|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Debug|x64.Build.0 = Debug|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Debug|x86.ActiveCfg = Debug|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Debug|x86.Build.0 = Debug|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Release|Any CPU.Build.0 = Release|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Release|x64.ActiveCfg = Release|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Release|x64.Build.0 = Release|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Release|x86.ActiveCfg = Release|Any CPU - {3CEF9F32-5887-4977-AB8A-1BBC48875A21}.Release|x86.Build.0 = Release|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Debug|x64.ActiveCfg = Debug|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Debug|x64.Build.0 = Debug|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Debug|x86.ActiveCfg = Debug|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Debug|x86.Build.0 = Debug|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Release|Any CPU.Build.0 = Release|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Release|x64.ActiveCfg = Release|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Release|x64.Build.0 = Release|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Release|x86.ActiveCfg = Release|Any CPU - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825}.Release|x86.Build.0 = Release|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Debug|x64.ActiveCfg = Debug|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Debug|x64.Build.0 = Debug|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Debug|x86.ActiveCfg = Debug|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Debug|x86.Build.0 = Debug|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Release|Any CPU.Build.0 = Release|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Release|x64.ActiveCfg = Release|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Release|x64.Build.0 = Release|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Release|x86.ActiveCfg = Release|Any CPU - {78D2B20D-B173-4CF2-A763-F2AA5347947E}.Release|x86.Build.0 = Release|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Debug|x64.ActiveCfg = Debug|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Debug|x64.Build.0 = Debug|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Debug|x86.ActiveCfg = Debug|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Debug|x86.Build.0 = Debug|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Release|Any CPU.Build.0 = Release|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Release|x64.ActiveCfg = Release|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Release|x64.Build.0 = Release|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Release|x86.ActiveCfg = Release|Any CPU - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94}.Release|x86.Build.0 = Release|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Debug|x64.ActiveCfg = Debug|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Debug|x64.Build.0 = Debug|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Debug|x86.ActiveCfg = Debug|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Debug|x86.Build.0 = Debug|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Release|Any CPU.Build.0 = Release|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Release|x64.ActiveCfg = Release|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Release|x64.Build.0 = Release|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Release|x86.ActiveCfg = Release|Any CPU - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4}.Release|x86.Build.0 = Release|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Debug|x64.ActiveCfg = Debug|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Debug|x64.Build.0 = Debug|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Debug|x86.ActiveCfg = Debug|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Debug|x86.Build.0 = Debug|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Release|Any CPU.Build.0 = Release|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Release|x64.ActiveCfg = Release|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Release|x64.Build.0 = Release|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Release|x86.ActiveCfg = Release|Any CPU - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB}.Release|x86.Build.0 = Release|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Debug|x64.ActiveCfg = Debug|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Debug|x64.Build.0 = Debug|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Debug|x86.ActiveCfg = Debug|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Debug|x86.Build.0 = Debug|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Release|Any CPU.Build.0 = Release|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Release|x64.ActiveCfg = Release|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Release|x64.Build.0 = Release|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Release|x86.ActiveCfg = Release|Any CPU - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59}.Release|x86.Build.0 = Release|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Debug|x64.ActiveCfg = Debug|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Debug|x64.Build.0 = Debug|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Debug|x86.ActiveCfg = Debug|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Debug|x86.Build.0 = Debug|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Release|Any CPU.Build.0 = Release|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Release|x64.ActiveCfg = Release|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Release|x64.Build.0 = Release|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Release|x86.ActiveCfg = Release|Any CPU - {F934B760-4847-4BA8-9F6A-7F750ECF2328}.Release|x86.Build.0 = Release|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Debug|x64.ActiveCfg = Debug|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Debug|x64.Build.0 = Debug|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Debug|x86.ActiveCfg = Debug|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Debug|x86.Build.0 = Debug|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Release|Any CPU.Build.0 = Release|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Release|x64.ActiveCfg = Release|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Release|x64.Build.0 = Release|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Release|x86.ActiveCfg = Release|Any CPU - {2DC38785-B7B6-49E9-84D4-103A56D3604A}.Release|x86.Build.0 = Release|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Debug|x64.ActiveCfg = Debug|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Debug|x64.Build.0 = Debug|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Debug|x86.ActiveCfg = Debug|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Debug|x86.Build.0 = Debug|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Release|Any CPU.Build.0 = Release|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Release|x64.ActiveCfg = Release|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Release|x64.Build.0 = Release|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Release|x86.ActiveCfg = Release|Any CPU - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4}.Release|x86.Build.0 = Release|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Debug|x64.ActiveCfg = Debug|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Debug|x64.Build.0 = Debug|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Debug|x86.ActiveCfg = Debug|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Debug|x86.Build.0 = Debug|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Release|Any CPU.Build.0 = Release|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Release|x64.ActiveCfg = Release|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Release|x64.Build.0 = Release|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Release|x86.ActiveCfg = Release|Any CPU - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1}.Release|x86.Build.0 = Release|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Debug|x64.ActiveCfg = Debug|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Debug|x64.Build.0 = Debug|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Debug|x86.ActiveCfg = Debug|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Debug|x86.Build.0 = Debug|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Release|Any CPU.Build.0 = Release|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Release|x64.ActiveCfg = Release|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Release|x64.Build.0 = Release|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Release|x86.ActiveCfg = Release|Any CPU - {7DD1722B-B971-4322-BA74-C622E808B84D}.Release|x86.Build.0 = Release|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Debug|x64.ActiveCfg = Debug|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Debug|x64.Build.0 = Debug|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Debug|x86.ActiveCfg = Debug|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Debug|x86.Build.0 = Debug|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Release|Any CPU.Build.0 = Release|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Release|x64.ActiveCfg = Release|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Release|x64.Build.0 = Release|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Release|x86.ActiveCfg = Release|Any CPU - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4}.Release|x86.Build.0 = Release|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Debug|x64.ActiveCfg = Debug|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Debug|x64.Build.0 = Debug|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Debug|x86.ActiveCfg = Debug|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Debug|x86.Build.0 = Debug|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Release|Any CPU.Build.0 = Release|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Release|x64.ActiveCfg = Release|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Release|x64.Build.0 = Release|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Release|x86.ActiveCfg = Release|Any CPU - {ADF569DC-E916-4F39-8ABF-8AA42F69266E}.Release|x86.Build.0 = Release|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Debug|x64.ActiveCfg = Debug|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Debug|x64.Build.0 = Debug|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Debug|x86.ActiveCfg = Debug|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Debug|x86.Build.0 = Debug|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Release|Any CPU.Build.0 = Release|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Release|x64.ActiveCfg = Release|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Release|x64.Build.0 = Release|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Release|x86.ActiveCfg = Release|Any CPU - {DFC13FA1-509C-42AF-870F-543C7A3F231B}.Release|x86.Build.0 = Release|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Debug|x64.ActiveCfg = Debug|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Debug|x64.Build.0 = Debug|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Debug|x86.ActiveCfg = Debug|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Debug|x86.Build.0 = Debug|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Release|Any CPU.Build.0 = Release|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Release|x64.ActiveCfg = Release|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Release|x64.Build.0 = Release|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Release|x86.ActiveCfg = Release|Any CPU - {2573526D-A764-4507-B2F6-1A2BF7A3FA93}.Release|x86.Build.0 = Release|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Debug|x64.ActiveCfg = Debug|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Debug|x64.Build.0 = Debug|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Debug|x86.ActiveCfg = Debug|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Debug|x86.Build.0 = Debug|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Release|Any CPU.Build.0 = Release|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Release|x64.ActiveCfg = Release|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Release|x64.Build.0 = Release|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Release|x86.ActiveCfg = Release|Any CPU - {6842C9FD-6720-43EA-83AD-DE315531DDA9}.Release|x86.Build.0 = Release|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Debug|x64.ActiveCfg = Debug|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Debug|x64.Build.0 = Debug|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Debug|x86.ActiveCfg = Debug|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Debug|x86.Build.0 = Debug|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Release|Any CPU.Build.0 = Release|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Release|x64.ActiveCfg = Release|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Release|x64.Build.0 = Release|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Release|x86.ActiveCfg = Release|Any CPU - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50}.Release|x86.Build.0 = Release|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Debug|x64.ActiveCfg = Debug|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Debug|x64.Build.0 = Debug|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Debug|x86.ActiveCfg = Debug|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Debug|x86.Build.0 = Debug|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Release|Any CPU.Build.0 = Release|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Release|x64.ActiveCfg = Release|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Release|x64.Build.0 = Release|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Release|x86.ActiveCfg = Release|Any CPU - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3}.Release|x86.Build.0 = Release|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Debug|x64.ActiveCfg = Debug|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Debug|x64.Build.0 = Debug|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Debug|x86.ActiveCfg = Debug|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Debug|x86.Build.0 = Debug|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Release|Any CPU.Build.0 = Release|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Release|x64.ActiveCfg = Release|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Release|x64.Build.0 = Release|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Release|x86.ActiveCfg = Release|Any CPU - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9}.Release|x86.Build.0 = Release|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Debug|Any CPU.Build.0 = Debug|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Debug|x64.ActiveCfg = Debug|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Debug|x64.Build.0 = Debug|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Debug|x86.ActiveCfg = Debug|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Debug|x86.Build.0 = Debug|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Release|Any CPU.ActiveCfg = Release|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Release|Any CPU.Build.0 = Release|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Release|x64.ActiveCfg = Release|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Release|x64.Build.0 = Release|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Release|x86.ActiveCfg = Release|Any CPU - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65}.Release|x86.Build.0 = Release|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Debug|x64.ActiveCfg = Debug|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Debug|x64.Build.0 = Debug|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Debug|x86.ActiveCfg = Debug|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Debug|x86.Build.0 = Debug|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Release|Any CPU.Build.0 = Release|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Release|x64.ActiveCfg = Release|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Release|x64.Build.0 = Release|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Release|x86.ActiveCfg = Release|Any CPU - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6}.Release|x86.Build.0 = Release|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Debug|x64.ActiveCfg = Debug|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Debug|x64.Build.0 = Debug|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Debug|x86.ActiveCfg = Debug|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Debug|x86.Build.0 = Debug|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Release|Any CPU.Build.0 = Release|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Release|x64.ActiveCfg = Release|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Release|x64.Build.0 = Release|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Release|x86.ActiveCfg = Release|Any CPU - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D}.Release|x86.Build.0 = Release|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Debug|x64.ActiveCfg = Debug|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Debug|x64.Build.0 = Debug|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Debug|x86.ActiveCfg = Debug|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Debug|x86.Build.0 = Debug|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Release|Any CPU.Build.0 = Release|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Release|x64.ActiveCfg = Release|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Release|x64.Build.0 = Release|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Release|x86.ActiveCfg = Release|Any CPU - {704EA4BF-71D9-442B-96D9-9B3E81068CC2}.Release|x86.Build.0 = Release|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Debug|x64.ActiveCfg = Debug|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Debug|x64.Build.0 = Debug|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Debug|x86.ActiveCfg = Debug|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Debug|x86.Build.0 = Debug|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Release|Any CPU.Build.0 = Release|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Release|x64.ActiveCfg = Release|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Release|x64.Build.0 = Release|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Release|x86.ActiveCfg = Release|Any CPU - {3549E707-E4B0-428F-9CF4-5B5B86219B6D}.Release|x86.Build.0 = Release|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Debug|x64.ActiveCfg = Debug|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Debug|x64.Build.0 = Debug|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Debug|x86.ActiveCfg = Debug|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Debug|x86.Build.0 = Debug|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Release|Any CPU.Build.0 = Release|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Release|x64.ActiveCfg = Release|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Release|x64.Build.0 = Release|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Release|x86.ActiveCfg = Release|Any CPU - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D}.Release|x86.Build.0 = Release|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Debug|x64.ActiveCfg = Debug|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Debug|x64.Build.0 = Debug|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Debug|x86.ActiveCfg = Debug|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Debug|x86.Build.0 = Debug|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Release|Any CPU.Build.0 = Release|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Release|x64.ActiveCfg = Release|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Release|x64.Build.0 = Release|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Release|x86.ActiveCfg = Release|Any CPU - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8}.Release|x86.Build.0 = Release|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Debug|x64.ActiveCfg = Debug|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Debug|x64.Build.0 = Debug|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Debug|x86.ActiveCfg = Debug|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Debug|x86.Build.0 = Debug|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Release|Any CPU.Build.0 = Release|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Release|x64.ActiveCfg = Release|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Release|x64.Build.0 = Release|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Release|x86.ActiveCfg = Release|Any CPU - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4}.Release|x86.Build.0 = Release|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Debug|x64.ActiveCfg = Debug|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Debug|x64.Build.0 = Debug|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Debug|x86.ActiveCfg = Debug|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Debug|x86.Build.0 = Debug|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Release|Any CPU.Build.0 = Release|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Release|x64.ActiveCfg = Release|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Release|x64.Build.0 = Release|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Release|x86.ActiveCfg = Release|Any CPU - {F47ED576-F347-44C4-BEC7-6C00A500555A}.Release|x86.Build.0 = Release|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Debug|x64.ActiveCfg = Debug|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Debug|x64.Build.0 = Debug|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Debug|x86.ActiveCfg = Debug|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Debug|x86.Build.0 = Debug|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Release|Any CPU.Build.0 = Release|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Release|x64.ActiveCfg = Release|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Release|x64.Build.0 = Release|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Release|x86.ActiveCfg = Release|Any CPU - {F55E52BD-A846-4808-9482-E4AB0921328D}.Release|x86.Build.0 = Release|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Debug|x64.ActiveCfg = Debug|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Debug|x64.Build.0 = Debug|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Debug|x86.ActiveCfg = Debug|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Debug|x86.Build.0 = Debug|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Release|Any CPU.Build.0 = Release|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Release|x64.ActiveCfg = Release|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Release|x64.Build.0 = Release|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Release|x86.ActiveCfg = Release|Any CPU - {7C7B19F2-5822-4DA2-80D2-E077CE705039}.Release|x86.Build.0 = Release|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Debug|x64.ActiveCfg = Debug|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Debug|x64.Build.0 = Debug|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Debug|x86.ActiveCfg = Debug|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Debug|x86.Build.0 = Debug|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Release|Any CPU.Build.0 = Release|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Release|x64.ActiveCfg = Release|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Release|x64.Build.0 = Release|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Release|x86.ActiveCfg = Release|Any CPU - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845}.Release|x86.Build.0 = Release|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Debug|x64.ActiveCfg = Debug|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Debug|x64.Build.0 = Debug|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Debug|x86.ActiveCfg = Debug|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Debug|x86.Build.0 = Debug|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Release|Any CPU.Build.0 = Release|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Release|x64.ActiveCfg = Release|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Release|x64.Build.0 = Release|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Release|x86.ActiveCfg = Release|Any CPU - {D5B3DA06-E60D-4C85-8835-6A26003365AA}.Release|x86.Build.0 = Release|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Debug|x64.ActiveCfg = Debug|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Debug|x64.Build.0 = Debug|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Debug|x86.ActiveCfg = Debug|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Debug|x86.Build.0 = Debug|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Release|Any CPU.Build.0 = Release|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Release|x64.ActiveCfg = Release|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Release|x64.Build.0 = Release|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Release|x86.ActiveCfg = Release|Any CPU - {2837A894-11D6-4DBF-B140-84C97C385A15}.Release|x86.Build.0 = Release|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Debug|x64.ActiveCfg = Debug|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Debug|x64.Build.0 = Debug|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Debug|x86.ActiveCfg = Debug|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Debug|x86.Build.0 = Debug|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Release|Any CPU.Build.0 = Release|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Release|x64.ActiveCfg = Release|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Release|x64.Build.0 = Release|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Release|x86.ActiveCfg = Release|Any CPU - {39B9F0B5-3C53-4140-B158-96C67C03E876}.Release|x86.Build.0 = Release|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Debug|x64.ActiveCfg = Debug|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Debug|x64.Build.0 = Debug|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Debug|x86.ActiveCfg = Debug|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Debug|x86.Build.0 = Debug|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Release|Any CPU.Build.0 = Release|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Release|x64.ActiveCfg = Release|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Release|x64.Build.0 = Release|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Release|x86.ActiveCfg = Release|Any CPU - {703ECD55-EF0E-4734-A28E-371EDD213EEF}.Release|x86.Build.0 = Release|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Debug|x64.ActiveCfg = Debug|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Debug|x64.Build.0 = Debug|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Debug|x86.ActiveCfg = Debug|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Debug|x86.Build.0 = Debug|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Release|Any CPU.Build.0 = Release|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Release|x64.ActiveCfg = Release|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Release|x64.Build.0 = Release|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Release|x86.ActiveCfg = Release|Any CPU - {9E2178A0-5915-4308-B6C3-5C8758A47788}.Release|x86.Build.0 = Release|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Debug|x64.ActiveCfg = Debug|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Debug|x64.Build.0 = Debug|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Debug|x86.ActiveCfg = Debug|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Debug|x86.Build.0 = Debug|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Release|Any CPU.Build.0 = Release|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Release|x64.ActiveCfg = Release|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Release|x64.Build.0 = Release|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Release|x86.ActiveCfg = Release|Any CPU - {39BCFE6F-50C4-45AE-8D13-38FB423AB619}.Release|x86.Build.0 = Release|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Debug|x64.ActiveCfg = Debug|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Debug|x64.Build.0 = Debug|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Debug|x86.ActiveCfg = Debug|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Debug|x86.Build.0 = Debug|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Release|Any CPU.Build.0 = Release|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Release|x64.ActiveCfg = Release|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Release|x64.Build.0 = Release|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Release|x86.ActiveCfg = Release|Any CPU - {3761F08D-06AE-4E07-8B88-F19C465DC169}.Release|x86.Build.0 = Release|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Debug|x64.ActiveCfg = Debug|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Debug|x64.Build.0 = Debug|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Debug|x86.ActiveCfg = Debug|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Debug|x86.Build.0 = Debug|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Release|Any CPU.Build.0 = Release|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Release|x64.ActiveCfg = Release|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Release|x64.Build.0 = Release|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Release|x86.ActiveCfg = Release|Any CPU - {DB02518A-49A1-4836-80B7-D69A70DE68BA}.Release|x86.Build.0 = Release|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Debug|x64.ActiveCfg = Debug|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Debug|x64.Build.0 = Debug|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Debug|x86.ActiveCfg = Debug|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Debug|x86.Build.0 = Debug|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Release|Any CPU.Build.0 = Release|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Release|x64.ActiveCfg = Release|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Release|x64.Build.0 = Release|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Release|x86.ActiveCfg = Release|Any CPU - {47C888A8-6887-4FA2-A202-8653684F3651}.Release|x86.Build.0 = Release|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Debug|x64.ActiveCfg = Debug|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Debug|x64.Build.0 = Debug|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Debug|x86.ActiveCfg = Debug|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Debug|x86.Build.0 = Debug|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Release|Any CPU.Build.0 = Release|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Release|x64.ActiveCfg = Release|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Release|x64.Build.0 = Release|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Release|x86.ActiveCfg = Release|Any CPU - {88691B89-0167-4E90-86F6-5FD6C974F7A3}.Release|x86.Build.0 = Release|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Debug|x64.ActiveCfg = Debug|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Debug|x64.Build.0 = Debug|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Debug|x86.ActiveCfg = Debug|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Debug|x86.Build.0 = Debug|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Release|Any CPU.Build.0 = Release|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Release|x64.ActiveCfg = Release|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Release|x64.Build.0 = Release|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Release|x86.ActiveCfg = Release|Any CPU - {63631241-3CA1-40E2-9545-01E019414E4F}.Release|x86.Build.0 = Release|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Debug|x64.ActiveCfg = Debug|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Debug|x64.Build.0 = Debug|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Debug|x86.ActiveCfg = Debug|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Debug|x86.Build.0 = Debug|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Release|Any CPU.Build.0 = Release|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Release|x64.ActiveCfg = Release|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Release|x64.Build.0 = Release|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Release|x86.ActiveCfg = Release|Any CPU - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {2D251CFD-A9DA-421F-B516-B25873348C08} = {471CA3C0-0BC9-4C0C-A013-D9356DBD0F38} - {00D7FBF0-801B-4B0E-9FDD-5C367E71444B} = {69958BAA-5D54-4F3F-82D6-F622F9491057} - {98E964A2-55DA-4740-9F2E-B64FDF6715DB} = {69958BAA-5D54-4F3F-82D6-F622F9491057} - {B9C61145-C010-4FAA-B9EA-4D1AEE20305F} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {4FDB7710-F4CA-45FB-9514-A4D288EDA44A} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {CC37B369-BA9E-4B82-A14D-68B58924885D} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {50F86C8F-E052-448C-84CE-08763945FCC7} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {3CEF9F32-5887-4977-AB8A-1BBC48875A21} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {8797AFCA-1EE8-4270-8FC4-F93A85F9C825} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {78D2B20D-B173-4CF2-A763-F2AA5347947E} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {C0BA460C-C1AC-4C54-9C88-60E4B8681E94} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {5889B0C9-50E5-4FDC-933B-8684B9FAB8E4} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {8BE0F92F-F353-4D63-9C6F-50D4A0BB7FAB} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {0CDA2765-C9DF-45EE-A099-0E2D4A980E59} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {F934B760-4847-4BA8-9F6A-7F750ECF2328} = {610E8065-1F29-41E8-A3FC-07ABDF16C8BB} - {2DC38785-B7B6-49E9-84D4-103A56D3604A} = {610E8065-1F29-41E8-A3FC-07ABDF16C8BB} - {610E8065-1F29-41E8-A3FC-07ABDF16C8BB} = {F49FFE3B-E1AE-483E-951F-D498F6ABA08E} - {263CD320-FAC5-4F0C-8FFB-788DD3C455D4} = {471CA3C0-0BC9-4C0C-A013-D9356DBD0F38} - {DD87D202-998B-4C20-8D68-C769797D7761} = {F49FFE3B-E1AE-483E-951F-D498F6ABA08E} - {D1E1AEDC-4870-4863-A8D3-B6A184E651C1} = {DD87D202-998B-4C20-8D68-C769797D7761} - {7DD1722B-B971-4322-BA74-C622E808B84D} = {DD87D202-998B-4C20-8D68-C769797D7761} - {A4C90265-C922-4145-8CDC-82EC5EBBC3A4} = {DD87D202-998B-4C20-8D68-C769797D7761} - {ADF569DC-E916-4F39-8ABF-8AA42F69266E} = {DD87D202-998B-4C20-8D68-C769797D7761} - {3B0C6936-E777-4413-B68A-1686A768F928} = {F49FFE3B-E1AE-483E-951F-D498F6ABA08E} - {DFC13FA1-509C-42AF-870F-543C7A3F231B} = {3B0C6936-E777-4413-B68A-1686A768F928} - {2573526D-A764-4507-B2F6-1A2BF7A3FA93} = {3B0C6936-E777-4413-B68A-1686A768F928} - {6842C9FD-6720-43EA-83AD-DE315531DDA9} = {3B0C6936-E777-4413-B68A-1686A768F928} - {D17C19AC-EC11-4661-BD23-DC8308CF71C0} = {F49FFE3B-E1AE-483E-951F-D498F6ABA08E} - {5DBEE6E0-8744-46E4-B711-8FEC98D41A50} = {D17C19AC-EC11-4661-BD23-DC8308CF71C0} - {BF78F36A-D072-4F1C-89B1-73D9C208ABB3} = {D17C19AC-EC11-4661-BD23-DC8308CF71C0} - {4BE54BD4-E561-4951-88F1-4DF09C3C3AB9} = {D17C19AC-EC11-4661-BD23-DC8308CF71C0} - {40E1EB3E-0CAE-45B1-B146-C7C8B3865C65} = {D17C19AC-EC11-4661-BD23-DC8308CF71C0} - {CE0C0288-E0A3-4B06-B05F-CCBFFC4E7BF6} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {D5519A45-AD22-41DB-ADDA-589C3E7D6C0D} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {704EA4BF-71D9-442B-96D9-9B3E81068CC2} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {3549E707-E4B0-428F-9CF4-5B5B86219B6D} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {1EA2BACF-3D44-4B05-A0E7-727AE13E693D} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {07E0093F-F05C-4AED-A489-1254C9854E21} = {F49FFE3B-E1AE-483E-951F-D498F6ABA08E} - {D815817F-CC0D-42CC-9C9C-8E229B9C03A8} = {07E0093F-F05C-4AED-A489-1254C9854E21} - {FAB78955-5E1F-4E6D-A79B-F85D8D18BDF4} = {07E0093F-F05C-4AED-A489-1254C9854E21} - {F47ED576-F347-44C4-BEC7-6C00A500555A} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {F55E52BD-A846-4808-9482-E4AB0921328D} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {7C7B19F2-5822-4DA2-80D2-E077CE705039} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {3A7712FC-9A91-4322-AF7E-4FEC6EB0D845} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {D5B3DA06-E60D-4C85-8835-6A26003365AA} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {2837A894-11D6-4DBF-B140-84C97C385A15} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {10109B62-DACC-42BA-AD8C-73DE4B93841B} = {F49FFE3B-E1AE-483E-951F-D498F6ABA08E} - {39B9F0B5-3C53-4140-B158-96C67C03E876} = {10109B62-DACC-42BA-AD8C-73DE4B93841B} - {703ECD55-EF0E-4734-A28E-371EDD213EEF} = {10109B62-DACC-42BA-AD8C-73DE4B93841B} - {9E2178A0-5915-4308-B6C3-5C8758A47788} = {10109B62-DACC-42BA-AD8C-73DE4B93841B} - {39BCFE6F-50C4-45AE-8D13-38FB423AB619} = {10109B62-DACC-42BA-AD8C-73DE4B93841B} - {3761F08D-06AE-4E07-8B88-F19C465DC169} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {DB02518A-49A1-4836-80B7-D69A70DE68BA} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {47C888A8-6887-4FA2-A202-8653684F3651} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {88691B89-0167-4E90-86F6-5FD6C974F7A3} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {63631241-3CA1-40E2-9545-01E019414E4F} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - {0C5BEA9A-9F07-49F5-8E84-80F3250E6516} = {98E964A2-55DA-4740-9F2E-B64FDF6715DB} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B1AF41DC-A03E-47B1-BBDB-3DC27ABD9F74} - EndGlobalSection -EndGlobal + +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}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{58D3A2C3-F96F-5E57-2C6B-ECE59D6A18FC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "McMaster.NETCore.Plugins", "src\Plugins\McMaster.NETCore.Plugins.csproj", "{2B65624B-6194-450C-970D-92E0F7CB1236}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0C88DD14-F956-CE84-757C-A364CCF449FC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hosihikari.Tests", "Hosihikari.Tests", "{34DD7E53-B439-98E4-B5A2-4A9A2CFAE897}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hosihikari.McMaster.NETCore.Plugins.Tests", "test\Hosihikari.Tests\Hosihikari.McMaster.NETCore.Plugins.Tests.csproj", "{96826AA6-ADBF-4835-978D-9735EC150E47}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2B65624B-6194-450C-970D-92E0F7CB1236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Debug|x64.ActiveCfg = Debug|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Debug|x64.Build.0 = Debug|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Debug|x86.ActiveCfg = Debug|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Debug|x86.Build.0 = Debug|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Release|Any CPU.Build.0 = Release|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Release|x64.ActiveCfg = Release|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Release|x64.Build.0 = Release|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Release|x86.ActiveCfg = Release|Any CPU + {2B65624B-6194-450C-970D-92E0F7CB1236}.Release|x86.Build.0 = Release|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Debug|x64.ActiveCfg = Debug|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Debug|x64.Build.0 = Debug|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Debug|x86.ActiveCfg = Debug|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Debug|x86.Build.0 = Debug|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Release|Any CPU.Build.0 = Release|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Release|x64.ActiveCfg = Release|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Release|x64.Build.0 = Release|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Release|x86.ActiveCfg = Release|Any CPU + {96826AA6-ADBF-4835-978D-9735EC150E47}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {58D3A2C3-F96F-5E57-2C6B-ECE59D6A18FC} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {2B65624B-6194-450C-970D-92E0F7CB1236} = {58D3A2C3-F96F-5E57-2C6B-ECE59D6A18FC} + {34DD7E53-B439-98E4-B5A2-4A9A2CFAE897} = {0C88DD14-F956-CE84-757C-A364CCF449FC} + {96826AA6-ADBF-4835-978D-9735EC150E47} = {34DD7E53-B439-98E4-B5A2-4A9A2CFAE897} + EndGlobalSection +EndGlobal diff --git a/FORK.md b/FORK.md new file mode 100644 index 0000000..d6e34e5 --- /dev/null +++ b/FORK.md @@ -0,0 +1,31 @@ +# Hosihikari fork of DotNetCorePlugins + +This repository is a fork of +[natemcmaster/DotNetCorePlugins](https://github.com/natemcmaster/DotNetCorePlugins) at commit +`bcf9c8bd6d50097cfea1c3eeba132b571410fabe`, used by the Hosihikari framework. It replaces the +earlier `Hosihikari.McMaster.NETCore.Plugins` repository; the package ID is unchanged. + +## Changes + +- `ManagedLoadContext.LoadUnmanagedDll` probes + `runtimes//native` before `.deps.json`-based native + resolution, so a plugin package can ship RID-specific native assets without a deps file. +- Package ID is `Hosihikari.McMaster.NETCore.Plugins`. +- `test/Hosihikari.Tests` covers the RID-specific path probe. +- Upstream `samples/` removed; `DotNetCorePlugins.sln` contains only the library and the + Hosihikari test project. + +## Publishing + +`.github/workflows/publish.yml` publishes `Hosihikari.McMaster.NETCore.Plugins` to nuget.org +through Trusted Publishing when a `v*` tag is pushed. The tag must equal `` in +`src/Plugins/McMaster.NETCore.Plugins.csproj`; the workflow checks this before packing and pushes +both the package and its symbols. + +## Licence + +Apache-2.0, the same as upstream. The original copyright and licence notices are retained. +Modified files: `src/Plugins/Loader/ManagedLoadContext.cs`, +`src/Plugins/McMaster.NETCore.Plugins.csproj`, `src/Plugins/Properties/AssemblyInfo.cs`, +`README.md`, `DotNetCorePlugins.sln`, `.github/workflows/ci.yml`; added `FORK.md` and +`test/Hosihikari.Tests`; removed `samples/`. See [LICENSE.txt](LICENSE.txt). diff --git a/README.md b/README.md index 9299510..51f10f0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ .NET Plugins ============ +> **Hosihikari fork.** This fork probes `runtimes//native` before deps.json-based native +> resolution (ADR-0034). Upstream samples are omitted; read them +> [upstream](https://github.com/natemcmaster/DotNetCorePlugins/tree/main/samples). See [FORK.md](FORK.md). + [![Build Status][ci-badge]][ci] [![Code Coverage][codecov-badge]][codecov] [![NuGet][nuget-badge] ![NuGet Downloads][nuget-download-badge]][nuget] @@ -56,7 +60,7 @@ Using plugins requires at least two projects: (1) the 'host' app which loads plu but typically also uses a third, (3) an contracts project which defines the interaction between the plugin and the host. -For a fully functional sample of this, see [samples/hello-world/](./samples/hello-world/) . +For a fully functional sample of this, see [samples/hello-world/](https://github.com/natemcmaster/DotNetCorePlugins/tree/main/samples/hello-world) upstream. ### The plugin contract @@ -69,7 +73,7 @@ public interface IPlugin } ``` -There is nothing special about the name "IPlugin" or the fact that it's an interface. This is just here to illustrate a concept. Look at [samples/](./samples/) for additional examples of ways you could define the interaction between host and plugins. +There is nothing special about the name "IPlugin" or the fact that it's an interface. This is just here to illustrate a concept. Look at the upstream [samples/](https://github.com/natemcmaster/DotNetCorePlugins/tree/main/samples) for additional examples of ways you could define the interaction between host and plugins. ### The plugins diff --git a/build.ps1 b/build.ps1 old mode 100755 new mode 100644 diff --git a/global.json b/global.json new file mode 100644 index 0000000..590a3b5 --- /dev/null +++ b/global.json @@ -0,0 +1,9 @@ +{ + "sdk": { + "version": "10.0.404", + "rollForward": "latestFeature" + }, + "test": { + "runner": "Microsoft.Testing.Platform" + } +} diff --git a/samples/aspnetcore-mvc/MvcApp/Controllers/HomeController.cs b/samples/aspnetcore-mvc/MvcApp/Controllers/HomeController.cs deleted file mode 100644 index 8c32c5d..0000000 --- a/samples/aspnetcore-mvc/MvcApp/Controllers/HomeController.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; - -namespace MvcWebApp.Controllers -{ - public class HomeController : Controller - { - public IActionResult Index() - { - return View(); - } - } -} diff --git a/samples/aspnetcore-mvc/MvcApp/MvcApp.csproj b/samples/aspnetcore-mvc/MvcApp/MvcApp.csproj deleted file mode 100644 index 6df2f63..0000000 --- a/samples/aspnetcore-mvc/MvcApp/MvcApp.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - net8.0 - - - - - - - - - - - - diff --git a/samples/aspnetcore-mvc/MvcApp/Program.cs b/samples/aspnetcore-mvc/MvcApp/Program.cs deleted file mode 100644 index 7d71032..0000000 --- a/samples/aspnetcore-mvc/MvcApp/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace MvcWebApp -{ - public class Program - { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} diff --git a/samples/aspnetcore-mvc/MvcApp/Startup.cs b/samples/aspnetcore-mvc/MvcApp/Startup.cs deleted file mode 100644 index 31eb228..0000000 --- a/samples/aspnetcore-mvc/MvcApp/Startup.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.DependencyInjection; - -namespace MvcWebApp -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - var mvcBuilder = services.AddMvc(); - - foreach (var dir in Directory.GetDirectories(Path.Combine(AppContext.BaseDirectory, "plugins"))) - { - var pluginFile = Path.Combine(dir, Path.GetFileName(dir) + ".dll"); - // The AddPluginFromAssemblyFile method comes from McMaster.NETCore.Plugins.Mvc - mvcBuilder.AddPluginFromAssemblyFile(pluginFile); - } - } - - public void Configure(IApplicationBuilder app) - { - app.UseDeveloperExceptionPage(); - app - .UseRouting() - .UseEndpoints(r => - { - r.MapDefaultControllerRoute(); - }); - } - } -} diff --git a/samples/aspnetcore-mvc/MvcApp/Views/Home/Index.cshtml b/samples/aspnetcore-mvc/MvcApp/Views/Home/Index.cshtml deleted file mode 100644 index 7d9c9c2..0000000 --- a/samples/aspnetcore-mvc/MvcApp/Views/Home/Index.cshtml +++ /dev/null @@ -1,9 +0,0 @@ -@{ - ViewData["Title"] = "Home Page"; -} - -

Hello from the web app.

- - diff --git a/samples/aspnetcore-mvc/MvcApp/Views/_ViewImports.cshtml b/samples/aspnetcore-mvc/MvcApp/Views/_ViewImports.cshtml deleted file mode 100644 index 7aaace4..0000000 --- a/samples/aspnetcore-mvc/MvcApp/Views/_ViewImports.cshtml +++ /dev/null @@ -1,2 +0,0 @@ -@using MvcWebApp -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/samples/aspnetcore-mvc/MvcAppPlugin1/MvcAppPlugin1.csproj b/samples/aspnetcore-mvc/MvcAppPlugin1/MvcAppPlugin1.csproj deleted file mode 100644 index 1205947..0000000 --- a/samples/aspnetcore-mvc/MvcAppPlugin1/MvcAppPlugin1.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net8.0 - true - - - - - - - diff --git a/samples/aspnetcore-mvc/MvcAppPlugin1/MyPluginController.cs b/samples/aspnetcore-mvc/MvcAppPlugin1/MyPluginController.cs deleted file mode 100644 index 9bd61a2..0000000 --- a/samples/aspnetcore-mvc/MvcAppPlugin1/MyPluginController.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Mvc; - -namespace MvcAppPlugin1 -{ - public class MyPluginController : Controller - { - public IActionResult Index() => View(); - } -} diff --git a/samples/aspnetcore-mvc/MvcAppPlugin1/Views/MyPlugin/Index.cshtml b/samples/aspnetcore-mvc/MvcAppPlugin1/Views/MyPlugin/Index.cshtml deleted file mode 100644 index 8f3ce3a..0000000 --- a/samples/aspnetcore-mvc/MvcAppPlugin1/Views/MyPlugin/Index.cshtml +++ /dev/null @@ -1,5 +0,0 @@ -@{ - ViewData["Title"] = "Plugin1"; -} - -

Hello world from Plugin1!

diff --git a/samples/aspnetcore-mvc/README.md b/samples/aspnetcore-mvc/README.md deleted file mode 100644 index 123bd75..0000000 --- a/samples/aspnetcore-mvc/README.md +++ /dev/null @@ -1,23 +0,0 @@ -ASP.NET Core MVC Sample -======================= - -This sample contains 2 projects which demonstrate a simple plugin scenario. - -1. 'MvcWebApp' is an ASP.NET Core application which scans for a 'plugins' folder in its base directory and attempts to load any plugins it finds -2. 'MvcAppPlugin1' which implements MVC controllers. - -Normally, an ASP.NET Core MVC application must have a direct dependency on any assemblies -which provide controllers. However, as this sample demonstrates, an MVC application -can load controllers from a list of assemblies which is not known ahead of time when the -host app is built. - -## Running the sample - -Open a command line to this folder and run: - -``` -dotnet restore -dotnet run --project MvcApp/ -``` - -Then open diff --git a/samples/aspnetcore-mvc/aspnetcore-mvc.sln b/samples/aspnetcore-mvc/aspnetcore-mvc.sln deleted file mode 100644 index 3f1f511..0000000 --- a/samples/aspnetcore-mvc/aspnetcore-mvc.sln +++ /dev/null @@ -1,48 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvcApp", "MvcApp\MvcApp.csproj", "{4F363469-7783-4A40-B1B5-455187AF1C76}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvcAppPlugin1", "MvcAppPlugin1\MvcAppPlugin1.csproj", "{B6316996-A470-470F-9CF1-475096A0510A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4F363469-7783-4A40-B1B5-455187AF1C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Debug|x64.ActiveCfg = Debug|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Debug|x64.Build.0 = Debug|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Debug|x86.ActiveCfg = Debug|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Debug|x86.Build.0 = Debug|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Release|Any CPU.Build.0 = Release|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Release|x64.ActiveCfg = Release|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Release|x64.Build.0 = Release|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Release|x86.ActiveCfg = Release|Any CPU - {4F363469-7783-4A40-B1B5-455187AF1C76}.Release|x86.Build.0 = Release|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Debug|x64.ActiveCfg = Debug|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Debug|x64.Build.0 = Debug|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Debug|x86.ActiveCfg = Debug|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Debug|x86.Build.0 = Debug|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Release|Any CPU.Build.0 = Release|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Release|x64.ActiveCfg = Release|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Release|x64.Build.0 = Release|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Release|x86.ActiveCfg = Release|Any CPU - {B6316996-A470-470F-9CF1-475096A0510A}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/samples/aspnetcore/Abstractions/Abstractions.csproj b/samples/aspnetcore/Abstractions/Abstractions.csproj deleted file mode 100644 index ea8d303..0000000 --- a/samples/aspnetcore/Abstractions/Abstractions.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - netstandard2.0 - - - - - - - diff --git a/samples/aspnetcore/Abstractions/IPlugin.cs b/samples/aspnetcore/Abstractions/IPlugin.cs deleted file mode 100644 index a9e7744..0000000 --- a/samples/aspnetcore/Abstractions/IPlugin.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace Plugin.Abstractions -{ - public interface IWebPlugin - { - void Configure(IApplicationBuilder appBuilder); - void ConfigureServices(IServiceCollection services); - } -} diff --git a/samples/aspnetcore/Abstractions/IPluginLink.cs b/samples/aspnetcore/Abstractions/IPluginLink.cs deleted file mode 100644 index f9e6ba4..0000000 --- a/samples/aspnetcore/Abstractions/IPluginLink.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Plugin.Abstractions -{ - public interface IPluginLink - { - string GetHref(); - } -} diff --git a/samples/aspnetcore/MainWebApp/MainWebApp.csproj b/samples/aspnetcore/MainWebApp/MainWebApp.csproj deleted file mode 100644 index 55c7e92..0000000 --- a/samples/aspnetcore/MainWebApp/MainWebApp.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - net8.0 - - - - - - - - - - - - - - - - - - - - diff --git a/samples/aspnetcore/MainWebApp/Pages/Index.cshtml b/samples/aspnetcore/MainWebApp/Pages/Index.cshtml deleted file mode 100644 index d0eaa7b..0000000 --- a/samples/aspnetcore/MainWebApp/Pages/Index.cshtml +++ /dev/null @@ -1,11 +0,0 @@ -@page -@using MainWebApp -@model IndexModel -
    -@foreach (var link in Model.Links) -{ -
  • - @link -
  • -} -
diff --git a/samples/aspnetcore/MainWebApp/Pages/Index.cshtml.cs b/samples/aspnetcore/MainWebApp/Pages/Index.cshtml.cs deleted file mode 100644 index e0a6dfc..0000000 --- a/samples/aspnetcore/MainWebApp/Pages/Index.cshtml.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNetCore.Mvc.RazorPages; -using Plugin.Abstractions; - -namespace MainWebApp -{ - public class IndexModel : PageModel - { - public IndexModel(IEnumerable pluginLinks) - { - Links = pluginLinks.Select(p => p.GetHref()).ToArray(); - } - - public string[] Links { get; } - - public void OnGet() - { - } - } -} diff --git a/samples/aspnetcore/MainWebApp/Program.cs b/samples/aspnetcore/MainWebApp/Program.cs deleted file mode 100644 index 300580a..0000000 --- a/samples/aspnetcore/MainWebApp/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace MainWebApp -{ - public class Program - { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} diff --git a/samples/aspnetcore/MainWebApp/Properties/launchSettings.json b/samples/aspnetcore/MainWebApp/Properties/launchSettings.json deleted file mode 100644 index 1b32514..0000000 --- a/samples/aspnetcore/MainWebApp/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35566", - "sslPort": 44362 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "WebAppWithPlugins": { - "commandName": "Project", - "launchBrowser": true, - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/samples/aspnetcore/MainWebApp/Startup.cs b/samples/aspnetcore/MainWebApp/Startup.cs deleted file mode 100644 index 7cc94f5..0000000 --- a/samples/aspnetcore/MainWebApp/Startup.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using McMaster.NETCore.Plugins; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Plugin.Abstractions; - -namespace MainWebApp -{ - public class Startup - { - private readonly List _plugins = new(); - - public Startup() - { - foreach (var pluginDir in Directory.GetDirectories(Path.Combine(AppContext.BaseDirectory, "plugins"))) - { - var dirName = Path.GetFileName(pluginDir); - var pluginFile = Path.Combine(pluginDir, dirName + ".dll"); - var loader = PluginLoader.CreateFromAssemblyFile(pluginFile, - // this ensures that the plugin resolves to the same version of DependencyInjection - // and ASP.NET Core that the current app uses - sharedTypes: new[] - { - typeof(IApplicationBuilder), - typeof(IWebPlugin), - typeof(IServiceCollection), - }); - foreach (var type in loader.LoadDefaultAssembly() - .GetTypes() - .Where(t => typeof(IWebPlugin).IsAssignableFrom(t) && !t.IsAbstract)) - { - Console.WriteLine("Found plugin " + type.Name); - var plugin = (IWebPlugin)Activator.CreateInstance(type)!; - _plugins.Add(plugin); - } - } - } - - public void ConfigureServices(IServiceCollection services) - { - services.AddMvc().AddMvcOptions(o => o.EnableEndpointRouting = false); - - foreach (var plugin in _plugins) - { - plugin.ConfigureServices(services); - } - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.UseDeveloperExceptionPage(); - - foreach (var plugin in _plugins) - { - plugin.Configure(app); - } - - app.UseMvcWithDefaultRoute(); - } - } -} diff --git a/samples/aspnetcore/README.md b/samples/aspnetcore/README.md deleted file mode 100644 index c174ac1..0000000 --- a/samples/aspnetcore/README.md +++ /dev/null @@ -1,42 +0,0 @@ -ASP.NET Core Sample -=================== - -This sample contains 4 projects which demonstrate a simple plugin scenario. - -1. 'Abstractions' defines common interfaces shared by the web application (host) and plugins -2. 'MainWebApp' is an ASP.NET Core application which scans for a 'plugins' folder in its base directory and attempts to load any plugins it finds -3. 'WebAppPlugin1' references 'Abstractions' and implements `IWebPlugin`. This plugin has a dependency on [AutoMapper](https://www.nuget.org/packages/AutoMapper/) version 6. -4. 'WebAppPlugin2' is the same as plugin1, but it uses AutoMapper version 7. - -Normally, in .NET Core applications you cannot reference two different versions of the same assembly. -However, as this sample demonstrates, using .NET Core plugins you can load and use two different versions. - -* http://localhost:5000/plugin/v1 responds with -``` -This plugin uses AutoMapper, Version=6.2.2.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005 -``` - -* http://localhost:5000/plugin/v2 responds with -``` -This plugin uses AutoMapper, Version=7.0.1.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005 -``` - -There are some important types, however, which must share the same identity between the plugins and the host. -To ensure type exchange works between the host and the plugins, the MainWebApp project uses the `sharedTypes` -parameter on `PluginLoader.CreateFromAssemblyFile`. - -```csharp - var loader = PluginLoader.CreateFromAssemblyFile( - pluginAssembly, - sharedTypes: new[] - { - typeof(IApplicationBuilder), - typeof(IWebPlugin), - typeof(IServiceCollection), - }); -``` - -This is important because the plugins in this sample are compiled for ASP.NET Core 2.0 interfaces, -but the MainWebApp uses ASP.NET Core 2.1. If not for this parameter, the plugins would also attempt to use -a private copy of the ASP.NET Core implementations and type exchange between the plugin and the web app -would fail to resolve `IApplicationBuilder` and `IServiceCollection` as the same type. diff --git a/samples/aspnetcore/WebAppPlugin1/WebAppPlugin1.csproj b/samples/aspnetcore/WebAppPlugin1/WebAppPlugin1.csproj deleted file mode 100644 index 683920f..0000000 --- a/samples/aspnetcore/WebAppPlugin1/WebAppPlugin1.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - netstandard2.0 - - - - - - - - diff --git a/samples/aspnetcore/WebAppPlugin1/WebPlugin1.cs b/samples/aspnetcore/WebAppPlugin1/WebPlugin1.cs deleted file mode 100644 index a3c956e..0000000 --- a/samples/aspnetcore/WebAppPlugin1/WebPlugin1.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Plugin.Abstractions; - -namespace Plugin1 -{ - internal class WebPlugin1 : IWebPlugin, IPluginLink - { - public string GetHref() => "/plugin/v1"; - - public void ConfigureServices(IServiceCollection services) - { - services.AddScoped(); - } - - public void Configure(IApplicationBuilder appBuilder) - { - appBuilder.Map("/plugin/v1", c => - { - var autoMapperType = typeof(AutoMapper.IMapper).Assembly; - c.Run(async (ctx) => - { - await ctx.Response.WriteAsync("This plugin uses " + autoMapperType.GetName().ToString()); - }); - }); - } - } -} diff --git a/samples/aspnetcore/WebAppPlugin2/WebAppPlugin2.csproj b/samples/aspnetcore/WebAppPlugin2/WebAppPlugin2.csproj deleted file mode 100644 index 3de01e7..0000000 --- a/samples/aspnetcore/WebAppPlugin2/WebAppPlugin2.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - netstandard2.0 - - - - - - - - diff --git a/samples/aspnetcore/WebAppPlugin2/WebPlugin2.cs b/samples/aspnetcore/WebAppPlugin2/WebPlugin2.cs deleted file mode 100644 index 13d2bf5..0000000 --- a/samples/aspnetcore/WebAppPlugin2/WebPlugin2.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Plugin.Abstractions; - -namespace Plugin2 -{ - internal class WebPlugin2 : IWebPlugin, IPluginLink - { - public string GetHref() => "/plugin/v2"; - - public void ConfigureServices(IServiceCollection services) - { - services.AddScoped(); - } - - public void Configure(IApplicationBuilder appBuilder) - { - appBuilder.Map("/plugin/v2", c => - { - var autoMapperType = typeof(AutoMapper.IMapper).Assembly; - c.Run(async (ctx) => - { - await ctx.Response.WriteAsync("This plugin uses " + autoMapperType.GetName().ToString()); - }); - }); - } - } -} diff --git a/samples/aspnetcore/aspnetcore.sln b/samples/aspnetcore/aspnetcore.sln deleted file mode 100644 index 4207936..0000000 --- a/samples/aspnetcore/aspnetcore.sln +++ /dev/null @@ -1,76 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Abstractions", "Abstractions\Abstractions.csproj", "{7CDF7B07-F103-4C22-9BB3-26B7C11716FF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MainWebApp", "MainWebApp\MainWebApp.csproj", "{781A86B1-C278-44CD-997B-1AA26D6BFB38}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAppPlugin1", "WebAppPlugin1\WebAppPlugin1.csproj", "{B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAppPlugin2", "WebAppPlugin2\WebAppPlugin2.csproj", "{ECAB37EC-1E82-4B1F-8C51-983E46A557A4}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Debug|x64.ActiveCfg = Debug|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Debug|x64.Build.0 = Debug|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Debug|x86.ActiveCfg = Debug|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Debug|x86.Build.0 = Debug|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Release|Any CPU.Build.0 = Release|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Release|x64.ActiveCfg = Release|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Release|x64.Build.0 = Release|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Release|x86.ActiveCfg = Release|Any CPU - {7CDF7B07-F103-4C22-9BB3-26B7C11716FF}.Release|x86.Build.0 = Release|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Debug|Any CPU.Build.0 = Debug|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Debug|x64.ActiveCfg = Debug|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Debug|x64.Build.0 = Debug|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Debug|x86.ActiveCfg = Debug|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Debug|x86.Build.0 = Debug|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Release|Any CPU.ActiveCfg = Release|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Release|Any CPU.Build.0 = Release|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Release|x64.ActiveCfg = Release|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Release|x64.Build.0 = Release|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Release|x86.ActiveCfg = Release|Any CPU - {781A86B1-C278-44CD-997B-1AA26D6BFB38}.Release|x86.Build.0 = Release|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Debug|x64.ActiveCfg = Debug|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Debug|x64.Build.0 = Debug|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Debug|x86.ActiveCfg = Debug|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Debug|x86.Build.0 = Debug|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Release|Any CPU.Build.0 = Release|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Release|x64.ActiveCfg = Release|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Release|x64.Build.0 = Release|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Release|x86.ActiveCfg = Release|Any CPU - {B17BE4CB-C382-4C7D-8B11-FD21E0E1A7CB}.Release|x86.Build.0 = Release|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Debug|x64.ActiveCfg = Debug|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Debug|x64.Build.0 = Debug|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Debug|x86.ActiveCfg = Debug|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Debug|x86.Build.0 = Debug|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Release|Any CPU.Build.0 = Release|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Release|x64.ActiveCfg = Release|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Release|x64.Build.0 = Release|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Release|x86.ActiveCfg = Release|Any CPU - {ECAB37EC-1E82-4B1F-8C51-983E46A557A4}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/samples/dependency-injection/DI.HostApp/DI.HostApp.csproj b/samples/dependency-injection/DI.HostApp/DI.HostApp.csproj deleted file mode 100644 index b6ff6ad..0000000 --- a/samples/dependency-injection/DI.HostApp/DI.HostApp.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - Exe - net8.0 - - - - - - - - - - - - - - - - - - diff --git a/samples/dependency-injection/DI.HostApp/Program.cs b/samples/dependency-injection/DI.HostApp/Program.cs deleted file mode 100644 index cc4cbd9..0000000 --- a/samples/dependency-injection/DI.HostApp/Program.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using McMaster.NETCore.Plugins; -using Microsoft.Extensions.DependencyInjection; - -namespace DependencyInjection -{ - public class Program - { - public static void Main(string[] args) - { - var services = new ServiceCollection(); - var loaders = GetPluginLoaders(); - - ConfigureServices(services, loaders); - - using var serviceProvider = services.BuildServiceProvider(); - - var consumer = serviceProvider.GetRequiredService(); - consumer.Consume(); - } - - private static List GetPluginLoaders() - { - var loaders = new List(); - - // create plugin loaders - var pluginsDir = Path.Combine(AppContext.BaseDirectory, "plugins"); - foreach (var dir in Directory.GetDirectories(pluginsDir)) - { - var dirName = Path.GetFileName(dir); - var pluginDll = Path.Combine(dir, dirName + ".dll"); - if (File.Exists(pluginDll)) - { - var loader = PluginLoader.CreateFromAssemblyFile( - pluginDll, - sharedTypes: new[] { typeof(IPluginFactory), typeof(IServiceCollection) }); - loaders.Add(loader); - } - } - - return loaders; - } - - private static void ConfigureServices(ServiceCollection services, List loaders) - { - // Create an instance of plugin types - foreach (var loader in loaders) - { - foreach (var pluginType in loader - .LoadDefaultAssembly() - .GetTypes() - .Where(t => typeof(IPluginFactory).IsAssignableFrom(t) && !t.IsAbstract)) - { - // This assumes the implementation of IPluginFactory has a parameterless constructor - var plugin = Activator.CreateInstance(pluginType) as IPluginFactory; - - plugin?.Configure(services); - } - } - } - - } -} diff --git a/samples/dependency-injection/DI.SharedAbstractions/DI.SharedAbstractions.csproj b/samples/dependency-injection/DI.SharedAbstractions/DI.SharedAbstractions.csproj deleted file mode 100644 index ba25dfa..0000000 --- a/samples/dependency-injection/DI.SharedAbstractions/DI.SharedAbstractions.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - netstandard2.0 - - - - - - - diff --git a/samples/dependency-injection/DI.SharedAbstractions/Fruit.cs b/samples/dependency-injection/DI.SharedAbstractions/Fruit.cs deleted file mode 100644 index d7ad871..0000000 --- a/samples/dependency-injection/DI.SharedAbstractions/Fruit.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace DependencyInjection -{ - public class Fruit - { - public Fruit(string name) - { - Name = name; - } - - public string Name { get; } - } -} diff --git a/samples/dependency-injection/DI.SharedAbstractions/IFruitConsumer.cs b/samples/dependency-injection/DI.SharedAbstractions/IFruitConsumer.cs deleted file mode 100644 index aec332b..0000000 --- a/samples/dependency-injection/DI.SharedAbstractions/IFruitConsumer.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace DependencyInjection -{ - public interface IFruitConsumer - { - void Consume(); - } -} diff --git a/samples/dependency-injection/DI.SharedAbstractions/IFruitProducer.cs b/samples/dependency-injection/DI.SharedAbstractions/IFruitProducer.cs deleted file mode 100644 index 5fa9f44..0000000 --- a/samples/dependency-injection/DI.SharedAbstractions/IFruitProducer.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace DependencyInjection -{ - public interface IFruitProducer - { - IEnumerable Produce(); - } -} diff --git a/samples/dependency-injection/DI.SharedAbstractions/IPluginFactory.cs b/samples/dependency-injection/DI.SharedAbstractions/IPluginFactory.cs deleted file mode 100644 index bbfbfa7..0000000 --- a/samples/dependency-injection/DI.SharedAbstractions/IPluginFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.Extensions.DependencyInjection; - -namespace DependencyInjection -{ - public interface IPluginFactory - { - void Configure(IServiceCollection services); - } -} diff --git a/samples/dependency-injection/MyPlugin1/MyFruitProducer.cs b/samples/dependency-injection/MyPlugin1/MyFruitProducer.cs deleted file mode 100644 index a923d7a..0000000 --- a/samples/dependency-injection/MyPlugin1/MyFruitProducer.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using DependencyInjection; - -namespace MyPlugin1 -{ - internal class MyFruitProducer : IFruitProducer - { - public IEnumerable Produce() - { - yield return new Fruit("banana"); - yield return new Fruit("orange"); - yield return new Fruit("strawberry"); - } - } -} diff --git a/samples/dependency-injection/MyPlugin1/MyPlugin1.csproj b/samples/dependency-injection/MyPlugin1/MyPlugin1.csproj deleted file mode 100644 index 9447b64..0000000 --- a/samples/dependency-injection/MyPlugin1/MyPlugin1.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - netstandard2.0 - - - - - - - diff --git a/samples/dependency-injection/MyPlugin1/PluginConfiguration.cs b/samples/dependency-injection/MyPlugin1/PluginConfiguration.cs deleted file mode 100644 index ae780cd..0000000 --- a/samples/dependency-injection/MyPlugin1/PluginConfiguration.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using DependencyInjection; -using Microsoft.Extensions.DependencyInjection; - -namespace MyPlugin1 -{ - public class PluginConfiguration : IPluginFactory - { - public void Configure(IServiceCollection services) - { - services.AddSingleton(); - } - } -} diff --git a/samples/dependency-injection/MyPlugin2/MyFruitConsumer.cs b/samples/dependency-injection/MyPlugin2/MyFruitConsumer.cs deleted file mode 100644 index 3ccfc65..0000000 --- a/samples/dependency-injection/MyPlugin2/MyFruitConsumer.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using DependencyInjection; - -namespace MyPlugin2 -{ - internal class MyFruitConsumer : IFruitConsumer - { - private readonly IEnumerable _producers; - - public MyFruitConsumer(IEnumerable producers) - { - _producers = producers; - } - - public void Consume() - { - foreach (var producer in _producers) - { - foreach (var fruit in producer.Produce()) - { - Console.WriteLine($"Consumed {fruit.Name}"); - } - } - } - } -} diff --git a/samples/dependency-injection/MyPlugin2/MyPlugin2.csproj b/samples/dependency-injection/MyPlugin2/MyPlugin2.csproj deleted file mode 100644 index 9447b64..0000000 --- a/samples/dependency-injection/MyPlugin2/MyPlugin2.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - netstandard2.0 - - - - - - - diff --git a/samples/dependency-injection/MyPlugin2/PluginConfiguration.cs b/samples/dependency-injection/MyPlugin2/PluginConfiguration.cs deleted file mode 100644 index 42e29a8..0000000 --- a/samples/dependency-injection/MyPlugin2/PluginConfiguration.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using DependencyInjection; -using Microsoft.Extensions.DependencyInjection; - -namespace MyPlugin2 -{ - public class PluginConfiguration : IPluginFactory - { - public void Configure(IServiceCollection services) - { - services.AddSingleton(); - } - } -} diff --git a/samples/dependency-injection/README.md b/samples/dependency-injection/README.md deleted file mode 100644 index bef3b56..0000000 --- a/samples/dependency-injection/README.md +++ /dev/null @@ -1,18 +0,0 @@ -Dependency Injection Sample -=========================== - -This sample contains 4 projects which demonstrate a plugin scenario which coordinates types between -plugins using a dependency injection container. - -* 'DI.HostApp' is a console application which scans for a 'plugins' folder in its base directory and attempts to load any plugins it finds. It then configures plugins in a dependency injection collection. -* 'DI.SharedAbstractions' which contains an interface shared by plugins and the host. -* 'MyPlugin1' and 'MyPlugin2' implement shared abstractions and register them with the host. - -## Running the sample - -Open a command line to this folder and run: - -``` -dotnet restore -dotnet run --project DI.HostApp/ -``` diff --git a/samples/dynamic-implementation/Contracts/Contracts.csproj b/samples/dynamic-implementation/Contracts/Contracts.csproj deleted file mode 100644 index b68338c..0000000 --- a/samples/dynamic-implementation/Contracts/Contracts.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Library - net8.0 - - - - - - - diff --git a/samples/dynamic-implementation/Contracts/Fruit.cs b/samples/dynamic-implementation/Contracts/Fruit.cs deleted file mode 100644 index 0439f4d..0000000 --- a/samples/dynamic-implementation/Contracts/Fruit.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Contracts -{ - public class Fruit - { - public string? Name { get; set; } - } -} diff --git a/samples/dynamic-implementation/Contracts/IFruitService.cs b/samples/dynamic-implementation/Contracts/IFruitService.cs deleted file mode 100644 index 2313606..0000000 --- a/samples/dynamic-implementation/Contracts/IFruitService.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Contracts -{ - public interface IFruitService - { - List GetFruits(); - } -} diff --git a/samples/dynamic-implementation/Contracts/IMixerService.cs b/samples/dynamic-implementation/Contracts/IMixerService.cs deleted file mode 100644 index 44fc8ac..0000000 --- a/samples/dynamic-implementation/Contracts/IMixerService.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Contracts -{ - public interface IMixerService - { - string MixIt(); - } -} diff --git a/samples/dynamic-implementation/Contracts/IPluginFactory.cs b/samples/dynamic-implementation/Contracts/IPluginFactory.cs deleted file mode 100644 index 2887a23..0000000 --- a/samples/dynamic-implementation/Contracts/IPluginFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.Extensions.DependencyInjection; - -namespace Contracts -{ - public interface IPluginFactory - { - void Configure(IServiceCollection services); - } -} diff --git a/samples/dynamic-implementation/DynamicImplementation.sln b/samples/dynamic-implementation/DynamicImplementation.sln deleted file mode 100644 index 71ebcb5..0000000 --- a/samples/dynamic-implementation/DynamicImplementation.sln +++ /dev/null @@ -1,43 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.757 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Host", "Host\Host.csproj", "{52016A46-23E0-48BB-AB79-CA13BECB55DF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contracts", "Contracts\Contracts.csproj", "{138FD514-7F88-43A5-A3CD-6084ABA316CD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceImplementation", "ServiceImplementation\ServiceImplementation.csproj", "{A8104C41-1224-4626-A812-ED561BD35432}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mixer", "Mixer\Mixer.csproj", "{DB9CE54F-D2A1-454A-BF58-19F41D4F3E9B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {52016A46-23E0-48BB-AB79-CA13BECB55DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52016A46-23E0-48BB-AB79-CA13BECB55DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52016A46-23E0-48BB-AB79-CA13BECB55DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52016A46-23E0-48BB-AB79-CA13BECB55DF}.Release|Any CPU.Build.0 = Release|Any CPU - {138FD514-7F88-43A5-A3CD-6084ABA316CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {138FD514-7F88-43A5-A3CD-6084ABA316CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {138FD514-7F88-43A5-A3CD-6084ABA316CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {138FD514-7F88-43A5-A3CD-6084ABA316CD}.Release|Any CPU.Build.0 = Release|Any CPU - {A8104C41-1224-4626-A812-ED561BD35432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A8104C41-1224-4626-A812-ED561BD35432}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A8104C41-1224-4626-A812-ED561BD35432}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A8104C41-1224-4626-A812-ED561BD35432}.Release|Any CPU.Build.0 = Release|Any CPU - {DB9CE54F-D2A1-454A-BF58-19F41D4F3E9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB9CE54F-D2A1-454A-BF58-19F41D4F3E9B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB9CE54F-D2A1-454A-BF58-19F41D4F3E9B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB9CE54F-D2A1-454A-BF58-19F41D4F3E9B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {98A28D5B-F00C-44F0-A5DA-80A16E551E57} - EndGlobalSection -EndGlobal diff --git a/samples/dynamic-implementation/Host/Host.csproj b/samples/dynamic-implementation/Host/Host.csproj deleted file mode 100644 index 0aca3d8..0000000 --- a/samples/dynamic-implementation/Host/Host.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - Exe - net8.0 - - - - - - - - - - - - - - - - - - - - diff --git a/samples/dynamic-implementation/Host/Program.cs b/samples/dynamic-implementation/Host/Program.cs deleted file mode 100644 index 9d6dbe9..0000000 --- a/samples/dynamic-implementation/Host/Program.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Contracts; -using McMaster.NETCore.Plugins; -using Microsoft.Extensions.DependencyInjection; - -namespace Host -{ - internal class Program - { - public static void Main(string[] args) - { - var services = new ServiceCollection(); - var loaders = GetPluginLoaders(); - - ConfigureServices(services, loaders); - - var serviceProvider = services.BuildServiceProvider(); - - var mixer = serviceProvider.GetRequiredService(); - mixer.MixIt(); - } - - private static List GetPluginLoaders() - { - var loaders = new List(); - - // create plugin loaders - var pluginsDir = Path.Combine(AppContext.BaseDirectory, "plugins"); - foreach (var dir in Directory.GetDirectories(pluginsDir)) - { - var dirName = Path.GetFileName(dir); - var pluginDll = Path.Combine(dir, dirName + ".dll"); - if (File.Exists(pluginDll)) - { - var loader = PluginLoader.CreateFromAssemblyFile( - pluginDll, - sharedTypes: new[] { typeof(IPluginFactory), typeof(IServiceCollection) }); - loaders.Add(loader); - } - } - - return loaders; - } - - private static void ConfigureServices(ServiceCollection services, List loaders) - { - // Create an instance of plugin types - foreach (var loader in loaders) - { - foreach (var pluginType in loader - .LoadDefaultAssembly() - .GetTypes() - .Where(t => typeof(IPluginFactory).IsAssignableFrom(t) && !t.IsAbstract)) - { - // This assumes the implementation of IPluginFactory has a parameterless constructor - var plugin = Activator.CreateInstance(pluginType) as IPluginFactory; - - plugin?.Configure(services); - } - } - } - } -} diff --git a/samples/dynamic-implementation/Mixer/Mixer.csproj b/samples/dynamic-implementation/Mixer/Mixer.csproj deleted file mode 100644 index 485d8bc..0000000 --- a/samples/dynamic-implementation/Mixer/Mixer.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net8.0 - Library - - - - - - - diff --git a/samples/dynamic-implementation/Mixer/MixerPlugin.cs b/samples/dynamic-implementation/Mixer/MixerPlugin.cs deleted file mode 100644 index 2de93df..0000000 --- a/samples/dynamic-implementation/Mixer/MixerPlugin.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Contracts; -using Microsoft.Extensions.DependencyInjection; - -namespace Mixer -{ - public class MixerPluginConfiguration : IPluginFactory - { - public void Configure(IServiceCollection services) - { - services.AddSingleton(); - services.AddSingleton(); - } - } -} diff --git a/samples/dynamic-implementation/Mixer/MixerService.cs b/samples/dynamic-implementation/Mixer/MixerService.cs deleted file mode 100644 index c494703..0000000 --- a/samples/dynamic-implementation/Mixer/MixerService.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Linq; -using Contracts; - -namespace Mixer -{ - public class MixerService : IMixerService - { - protected IFruitService fruit; - public MixerService(IFruitService fruit) - { - this.fruit = fruit; - } - - public string MixIt() - { - return string.Join(",", fruit.GetFruits().Select(x => x.Name).ToArray()); - } - } -} diff --git a/samples/dynamic-implementation/Mixer/StandardFruiteService.cs b/samples/dynamic-implementation/Mixer/StandardFruiteService.cs deleted file mode 100644 index cff7fe5..0000000 --- a/samples/dynamic-implementation/Mixer/StandardFruiteService.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Contracts; - -namespace Mixer -{ - public class StandardFruiteService : IFruitService - { - public List GetFruits() - { - return new List() - { - new Fruit { Name="Banana" }, - new Fruit { Name="Apple" }, - new Fruit { Name="Carrot" }, - }; - } - } -} diff --git a/samples/dynamic-implementation/README.md b/samples/dynamic-implementation/README.md deleted file mode 100644 index a3a2a14..0000000 --- a/samples/dynamic-implementation/README.md +++ /dev/null @@ -1,21 +0,0 @@ -Dynamic implementation -=========================== - -This sample contains 4 projects which demonstrate a plugin scenario that coordinates types between -plugins using a dependency injection container. In this scenario, one implements a default service definition (Mixer), but adding a plugin the normal behavior is changed. - -This sample can be useful to create a pluggable application that can be extended or altered just by adding new modules. - -* 'Host': console app that contains the sample -* 'Contracts': which contains an interface shared by plugins and the host. -* 'Mixer': this plugin contains the default mixer implementation. It contains the FruitService, which gives 3 fruits and the Mixer service that returns the fruit shake. -* 'ServiceImplementation': this plugin contains an alternative version of the FruitService. By adding this to the plugin set, the default behavior is altered and the shake is composed by only Banana. - -## Running the sample - -Open a command line to this folder and run, otherwise open the .sln file: - -``` -dotnet restore -dotnet run --project Host/ -``` diff --git a/samples/dynamic-implementation/ServiceImplementation/OverrideFruiteService.cs b/samples/dynamic-implementation/ServiceImplementation/OverrideFruiteService.cs deleted file mode 100644 index 0e4e503..0000000 --- a/samples/dynamic-implementation/ServiceImplementation/OverrideFruiteService.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Contracts; - -namespace ServiceImplementation -{ - public class OverrideFruiteService : IFruitService - { - public List GetFruits() - { - return new List() - { - new Fruit { Name="Banana" } - }; - } - } -} diff --git a/samples/dynamic-implementation/ServiceImplementation/OverridePlugin.cs b/samples/dynamic-implementation/ServiceImplementation/OverridePlugin.cs deleted file mode 100644 index 73f1f18..0000000 --- a/samples/dynamic-implementation/ServiceImplementation/OverridePlugin.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Contracts; -using Microsoft.Extensions.DependencyInjection; - -namespace ServiceImplementation -{ - public class OverridePluginConfiguration : IPluginFactory - { - public void Configure(IServiceCollection services) - { - //this service override the standard one. unload this plugin or comment this to use the basic service - services.AddSingleton(); - } - } -} diff --git a/samples/dynamic-implementation/ServiceImplementation/ServiceImplementation.csproj b/samples/dynamic-implementation/ServiceImplementation/ServiceImplementation.csproj deleted file mode 100644 index 26cd29c..0000000 --- a/samples/dynamic-implementation/ServiceImplementation/ServiceImplementation.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Library - net8.0 - - - - - - - diff --git a/samples/hello-world/HostApp/HostApp.csproj b/samples/hello-world/HostApp/HostApp.csproj deleted file mode 100644 index efe024a..0000000 --- a/samples/hello-world/HostApp/HostApp.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - Exe - net8.0 - - - - - - - - - - - - - diff --git a/samples/hello-world/HostApp/Program.cs b/samples/hello-world/HostApp/Program.cs deleted file mode 100644 index 2ff700d..0000000 --- a/samples/hello-world/HostApp/Program.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using HelloWorld; -using McMaster.NETCore.Plugins; - -var loaders = new List(); - -// create plugin loaders -var pluginsDir = Path.Combine(AppContext.BaseDirectory, "plugins"); -foreach (var dir in Directory.GetDirectories(pluginsDir)) -{ - var dirName = Path.GetFileName(dir); - var pluginDll = Path.Combine(dir, dirName + ".dll"); - if (File.Exists(pluginDll)) - { - var loader = PluginLoader.CreateFromAssemblyFile( - pluginDll, - sharedTypes: new[] { typeof(IPlugin) }); - loaders.Add(loader); - } -} - -// Create an instance of plugin types -foreach (var loader in loaders) -{ - foreach (var pluginType in loader - .LoadDefaultAssembly() - .GetTypes() - .Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsAbstract)) - { - // This assumes the implementation of IPlugin has a parameterless constructor - var plugin = Activator.CreateInstance(pluginType) as IPlugin; - - Console.WriteLine($"Created plugin instance '{plugin?.GetName()}'."); - } -} diff --git a/samples/hello-world/MyPlugin/MyPlugin.csproj b/samples/hello-world/MyPlugin/MyPlugin.csproj deleted file mode 100644 index 985bfc0..0000000 --- a/samples/hello-world/MyPlugin/MyPlugin.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - netstandard2.0 - - - - - - - diff --git a/samples/hello-world/MyPlugin/MyPlugin1.cs b/samples/hello-world/MyPlugin/MyPlugin1.cs deleted file mode 100644 index bd5e461..0000000 --- a/samples/hello-world/MyPlugin/MyPlugin1.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using HelloWorld; - -namespace MyPlugin -{ - internal class MyPlugin1 : IPlugin - { - public string GetName() => "My plugin v1"; - } -} diff --git a/samples/hello-world/PluginContract/IPlugin.cs b/samples/hello-world/PluginContract/IPlugin.cs deleted file mode 100644 index 591d45c..0000000 --- a/samples/hello-world/PluginContract/IPlugin.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace HelloWorld -{ - /// - /// This interface is an example of one way to define the interactions between the host and plugins. - /// There is nothing special about the name "IPlugin"; it's used here to illustrate a concept. - /// Look at https://github.com/natemcmaster/DotNetCorePlugins/tree/main/samples for additional examples - /// of ways you could define the interaction between host and plugins. - /// - public interface IPlugin - { - string GetName(); - } -} diff --git a/samples/hello-world/PluginContract/PluginContract.csproj b/samples/hello-world/PluginContract/PluginContract.csproj deleted file mode 100644 index 9f5c4f4..0000000 --- a/samples/hello-world/PluginContract/PluginContract.csproj +++ /dev/null @@ -1,7 +0,0 @@ - - - - netstandard2.0 - - - diff --git a/samples/hello-world/README.md b/samples/hello-world/README.md deleted file mode 100644 index c8a8820..0000000 --- a/samples/hello-world/README.md +++ /dev/null @@ -1,17 +0,0 @@ -"Hello World" Sample -==================== - -This sample contains 3 projects which demonstrate a simple plugin scenario. - -1. 'HostApp' is a console application which scans for a 'plugins' folder in its base directory and attempts to load any plugins it finds -2. 'MyPlugin' which implements an implementation of this plugin -3. 'PluginContract' which contains an interface shared by plugins and the host. - -## Running the sample - -Open a command line to this folder and run: - -``` -dotnet restore -dotnet run --project HostApp/ -``` diff --git a/samples/hello-world/hello-world.sln b/samples/hello-world/hello-world.sln deleted file mode 100644 index d27f2c2..0000000 --- a/samples/hello-world/hello-world.sln +++ /dev/null @@ -1,62 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HostApp", "HostApp\HostApp.csproj", "{FAA91115-37CE-4A74-8EC1-C58E15E5D683}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyPlugin", "MyPlugin\MyPlugin.csproj", "{EF895D6F-B174-46AF-936C-F4E3FE2B96E0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginContract", "PluginContract\PluginContract.csproj", "{5F3E90BD-7D9E-4469-A89A-63B0A8F77465}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Debug|x64.ActiveCfg = Debug|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Debug|x64.Build.0 = Debug|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Debug|x86.ActiveCfg = Debug|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Debug|x86.Build.0 = Debug|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Release|Any CPU.Build.0 = Release|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Release|x64.ActiveCfg = Release|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Release|x64.Build.0 = Release|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Release|x86.ActiveCfg = Release|Any CPU - {FAA91115-37CE-4A74-8EC1-C58E15E5D683}.Release|x86.Build.0 = Release|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Debug|x64.ActiveCfg = Debug|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Debug|x64.Build.0 = Debug|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Debug|x86.ActiveCfg = Debug|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Debug|x86.Build.0 = Debug|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Release|Any CPU.Build.0 = Release|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Release|x64.ActiveCfg = Release|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Release|x64.Build.0 = Release|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Release|x86.ActiveCfg = Release|Any CPU - {EF895D6F-B174-46AF-936C-F4E3FE2B96E0}.Release|x86.Build.0 = Release|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Debug|x64.ActiveCfg = Debug|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Debug|x64.Build.0 = Debug|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Debug|x86.ActiveCfg = Debug|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Debug|x86.Build.0 = Debug|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Release|Any CPU.Build.0 = Release|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Release|x64.ActiveCfg = Release|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Release|x64.Build.0 = Release|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Release|x86.ActiveCfg = Release|Any CPU - {5F3E90BD-7D9E-4469-A89A-63B0A8F77465}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/samples/hot-reload/HotReloadApp/HotReloadApp.csproj b/samples/hot-reload/HotReloadApp/HotReloadApp.csproj deleted file mode 100644 index fdf43cd..0000000 --- a/samples/hot-reload/HotReloadApp/HotReloadApp.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - Exe - net8.0 - - - - - - - - diff --git a/samples/hot-reload/HotReloadApp/Program.cs b/samples/hot-reload/HotReloadApp/Program.cs deleted file mode 100644 index 24a0982..0000000 --- a/samples/hot-reload/HotReloadApp/Program.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; -using McMaster.NETCore.Plugins; - -var pluginPath = args[0]; -var loader = PluginLoader.CreateFromAssemblyFile(pluginPath, - config => config.EnableHotReload = true); - -loader.Reloaded += ShowPluginInfo; - -var cts = new CancellationTokenSource(); -Console.CancelKeyPress += (_, __) => cts.Cancel(); - -// Show info on first load -InvokePlugin(loader); - -await Task.Delay(-1, cts.Token); - -static void ShowPluginInfo(object sender, PluginReloadedEventArgs eventArgs) -{ - Console.ForegroundColor = ConsoleColor.Blue; - Console.Write("HotReloadApp: "); - Console.ResetColor(); - Console.WriteLine("plugin was reloaded"); - InvokePlugin(eventArgs.Loader); -} - -static void InvokePlugin(PluginLoader loader) -{ - var assembly = loader.LoadDefaultAssembly(); - assembly - .GetType("TimestampedPlugin.InfoDisplayer", throwOnError: true) - !.GetMethod("Print") - !.Invoke(null, null); -} diff --git a/samples/hot-reload/README.md b/samples/hot-reload/README.md deleted file mode 100644 index 986602c..0000000 --- a/samples/hot-reload/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Hot Reload Sample - -This is a minimal sample of how to take advantage of hot reloading support. - -To run this sample, execute the `run.sh` script. This will: - -* Compile the projects once -* Start the HotReloadApp console application - * This creates a single loader with hot reloading enabled - * It subscribes to the `PluginLoader.Reloaded` event to be notified when a new version of the assemblies - are availabled. - * It invokes the new version of the assembly -* Rebuilds the TimestampedPlugin every 5 seconds (until you press CTRL+C to exit) diff --git a/samples/hot-reload/TimestampedPlugin/InfoDisplayer.cs b/samples/hot-reload/TimestampedPlugin/InfoDisplayer.cs deleted file mode 100644 index 7e0b6a1..0000000 --- a/samples/hot-reload/TimestampedPlugin/InfoDisplayer.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Nate McMaster. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using System.Reflection; -using Microsoft.Data.Sqlite; - -namespace TimestampedPlugin -{ - public class InfoDisplayer - { - public static void Print() - { - // Use something from Microsoft.Data.Sqlite to trigger loading of native dependency - var connectionString = new SqliteConnectionStringBuilder - { - DataSource = "HELLO" - }; - - var compileTimestamp = typeof(InfoDisplayer) - .Assembly - .GetCustomAttributes() - .First(a => a.Key == "CompileTimestamp") - .Value; - Console.ForegroundColor = ConsoleColor.Green; - Console.Write("TimestampedPlugin: "); - Console.ResetColor(); - Console.WriteLine($"this plugin was compiled at {compileTimestamp}. {connectionString.DataSource}!"); - } - } -} diff --git a/samples/hot-reload/TimestampedPlugin/TimestampedPlugin.csproj b/samples/hot-reload/TimestampedPlugin/TimestampedPlugin.csproj deleted file mode 100644 index 75e9a11..0000000 --- a/samples/hot-reload/TimestampedPlugin/TimestampedPlugin.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net8.0 - - - - - <_Parameter1>CompileTimestamp - <_Parameter2>$([System.DateTime]::Now.ToString('h:mm:ss tt')) - - - - - - - - diff --git a/samples/hot-reload/hot-reload.sln b/samples/hot-reload/hot-reload.sln deleted file mode 100644 index b6f3054..0000000 --- a/samples/hot-reload/hot-reload.sln +++ /dev/null @@ -1,48 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29209.152 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HotReloadApp", "HotReloadApp\HotReloadApp.csproj", "{421F2562-390A-45C3-B028-32A0027AD8BD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TimestampedPlugin", "TimestampedPlugin\TimestampedPlugin.csproj", "{92DCE5FD-1A77-4A77-AE04-2820004A446B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {421F2562-390A-45C3-B028-32A0027AD8BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Debug|x64.ActiveCfg = Debug|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Debug|x64.Build.0 = Debug|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Debug|x86.ActiveCfg = Debug|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Debug|x86.Build.0 = Debug|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Release|Any CPU.Build.0 = Release|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Release|x64.ActiveCfg = Release|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Release|x64.Build.0 = Release|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Release|x86.ActiveCfg = Release|Any CPU - {421F2562-390A-45C3-B028-32A0027AD8BD}.Release|x86.Build.0 = Release|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Debug|x64.ActiveCfg = Debug|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Debug|x64.Build.0 = Debug|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Debug|x86.ActiveCfg = Debug|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Debug|x86.Build.0 = Debug|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Release|Any CPU.Build.0 = Release|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Release|x64.ActiveCfg = Release|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Release|x64.Build.0 = Release|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Release|x86.ActiveCfg = Release|Any CPU - {92DCE5FD-1A77-4A77-AE04-2820004A446B}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/samples/hot-reload/run.ps1 b/samples/hot-reload/run.ps1 deleted file mode 100755 index bdd2dc9..0000000 --- a/samples/hot-reload/run.ps1 +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env pwsh - -$ErrorActionPreference = 'Stop' - -Push-Location $PSScriptRoot -try { - $publish_dir = "$PSScriptRoot/bin/plugins/TimestampedPlugin/" - - function log { - Write-Host -NoNewline -ForegroundColor Yellow "run.ps1: " - Write-Host $args - } - - function publish { - Write-Host "" - dotnet publish --no-restore TimestampedPlugin/ -o $publish_dir -nologo - Write-Host "" - } - - log "Compiling apps" - - & dotnet build HotReloadApp -nologo -clp:NoSummary - & publish - - log "Use CTRL+C to exit" - - $bg_args = @("run", "--no-build", "--project", "HotReloadApp", "$publish_dir/TimestampedPlugin.dll") - $host_process = Start-Process -NoNewWindow -FilePath dotnet -ArgumentList $bg_args - try { - while ($true) { - Start-Sleep 5 - log "Rebuilding plugin..." - publish - } - } - finally { - $host_process.Kill() - } -} -finally { - Pop-Location -} diff --git a/samples/hot-reload/run.sh b/samples/hot-reload/run.sh deleted file mode 100755 index e991b47..0000000 --- a/samples/hot-reload/run.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e - -RESET="\033[0m" -YELLOW="\033[0;33m" -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -pushd $DIR >/dev/null - -publish_dir="$DIR/bin/plugins/TimestampedPlugin/" - -publish() { - echo "" - dotnet publish --no-restore TimestampedPlugin/ -o $publish_dir -nologo - echo "" -} - -echo -e "${YELLOW}run.sh:${RESET} Compiling apps" -dotnet build HotReloadApp -nologo -clp:NoSummary -publish - -trap "kill 0" EXIT - -echo -e "${YELLOW}run.sh:${RESET} Use CTRL+C to exit" - -dotnet run --no-build --project HotReloadApp -- "$publish_dir/TimestampedPlugin.dll" & - -while true -do - sleep 5 - echo -e "${YELLOW}run.sh:${RESET} Rebuilding plugin..." - publish -done diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 33bd792..dda0ebe 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,8 +1,8 @@ - - + + diff --git a/src/Plugins/Loader/ManagedLoadContext.cs b/src/Plugins/Loader/ManagedLoadContext.cs index 1ade59b..2cded26 100644 --- a/src/Plugins/Loader/ManagedLoadContext.cs +++ b/src/Plugins/Loader/ManagedLoadContext.cs @@ -9,6 +9,7 @@ using System.Reflection; using System.Runtime.Loader; using McMaster.NETCore.Plugins.LibraryModel; +using RuntimeInformation = System.Runtime.InteropServices.RuntimeInformation; namespace McMaster.NETCore.Plugins.Loader { @@ -201,6 +202,13 @@ public Assembly LoadAssemblyFromFilePath(string path) /// protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) { + // Hosihikari fork: a plugin package may ship RID-specific native assets without a deps.json. + var runtimeSpecificPath = GetRuntimeSpecificNativeLibraryPath(_basePath, unmanagedDllName); + if (runtimeSpecificPath != null) + { + return LoadUnmanagedDllFromResolvedPath(runtimeSpecificPath); + } + var resolvedPath = _dependencyResolver.ResolveUnmanagedDllToPath(unmanagedDllName); if (!string.IsNullOrEmpty(resolvedPath) && File.Exists(resolvedPath)) { @@ -269,6 +277,38 @@ protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) return base.LoadUnmanagedDll(unmanagedDllName); } + /// + /// Finds a native library under runtimes/<current RID>/native, if the package ships one. + /// + internal static string? GetRuntimeSpecificNativeLibraryPath(string basePath, string unmanagedDllName) + { + var nativeDirectory = Path.Combine(basePath, "runtimes", RuntimeInformation.RuntimeIdentifier, "native"); + if (!Directory.Exists(nativeDirectory)) + { + return null; + } + + foreach (var prefix in PlatformInformation.NativeLibraryPrefixes) + { + foreach (var extension in PlatformInformation.NativeLibraryExtensions) + { + var candidate = Path.Combine(nativeDirectory, prefix + unmanagedDllName + extension); + if (File.Exists(candidate)) + { + return candidate; + } + + candidate = Path.Combine(nativeDirectory, prefix + unmanagedDllName); + if (File.Exists(candidate)) + { + return candidate; + } + } + } + + return null; + } + private bool SearchForLibrary(ManagedLibrary library, out string? path) { // 1. Check for in _basePath + app local path diff --git a/src/Plugins/McMaster.NETCore.Plugins.csproj b/src/Plugins/McMaster.NETCore.Plugins.csproj index d39c9c9..fc8e1b0 100644 --- a/src/Plugins/McMaster.NETCore.Plugins.csproj +++ b/src/Plugins/McMaster.NETCore.Plugins.csproj @@ -1,15 +1,18 @@ - net8.0 + net10.0 library true true - Provides API for dynamically loading assemblies into a .NET application. - -This package should be used by the host application which needs to load plugins. -See https://github.com/natemcmaster/DotNetCorePlugins/blob/main/README.md for more samples and documentation. - - .NET Core;plugins + Hosihikari.McMaster.NETCore.Plugins + 2.1.0 + 2.1.0-hosihikari.2 + Hosihikari fork: probe runtimes/<rid>/native before deps.json-based native resolution. + Nate McMaster;Hosihikari framework + https://github.com/HosihikariFramework/DotNetCorePlugins + https://github.com/HosihikariFramework/DotNetCorePlugins.git + Hosihikari fork of McMaster.NETCore.Plugins. Provides API for dynamically loading assemblies into a .NET application; this fork probes runtimes/<rid>/native before deps.json-based native resolution. + .NET Core;plugins;hosihikari diff --git a/src/Plugins/Properties/AssemblyInfo.cs b/src/Plugins/Properties/AssemblyInfo.cs index 7ed81e4..12f8e14 100644 --- a/src/Plugins/Properties/AssemblyInfo.cs +++ b/src/Plugins/Properties/AssemblyInfo.cs @@ -4,3 +4,4 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("McMaster.NETCore.Plugins.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001001df0eba4297c8ffdf114a13714ad787744619dfb18e29191703f6f782d6a09e4a4cac35b8c768cbbd9ade8197bc0f66ec66fabc9071a206c8060af8b7a332236968d3ee44b90bd2f30d0edcb6150555c6f8d988e48234debaf2d427a08d7c06ba1343411142dc8ac996f7f7dbe0e93d13f17a7624db5400510e6144b0fd683b9")] +[assembly: InternalsVisibleTo("Hosihikari.McMaster.NETCore.Plugins.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001001df0eba4297c8ffdf114a13714ad787744619dfb18e29191703f6f782d6a09e4a4cac35b8c768cbbd9ade8197bc0f66ec66fabc9071a206c8060af8b7a332236968d3ee44b90bd2f30d0edcb6150555c6f8d988e48234debaf2d427a08d7c06ba1343411142dc8ac996f7f7dbe0e93d13f17a7624db5400510e6144b0fd683b9")] diff --git a/src/Plugins/PublicAPI.Unshipped.txt b/src/Plugins/PublicAPI.Unshipped.txt index e69de29..de2ce0e 100644 --- a/src/Plugins/PublicAPI.Unshipped.txt +++ b/src/Plugins/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +virtual McMaster.NETCore.Plugins.PluginReloadedEventHandler.Invoke(object! sender, McMaster.NETCore.Plugins.PluginReloadedEventArgs! eventArgs) -> void diff --git a/test/Hosihikari.Tests/Hosihikari.McMaster.NETCore.Plugins.Tests.csproj b/test/Hosihikari.Tests/Hosihikari.McMaster.NETCore.Plugins.Tests.csproj new file mode 100644 index 0000000..cac7a72 --- /dev/null +++ b/test/Hosihikari.Tests/Hosihikari.McMaster.NETCore.Plugins.Tests.csproj @@ -0,0 +1,22 @@ + + + + net10.0 + false + true + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/test/Hosihikari.Tests/NativeRidPathTests.cs b/test/Hosihikari.Tests/NativeRidPathTests.cs new file mode 100644 index 0000000..fd2a820 --- /dev/null +++ b/test/Hosihikari.Tests/NativeRidPathTests.cs @@ -0,0 +1,40 @@ +// Copyright (c) Nate McMaster. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Runtime.InteropServices; +using McMaster.NETCore.Plugins.Loader; +using Xunit; + +namespace Hosihikari.McMaster.NETCore.Plugins.Tests +{ + public class NativeRidPathTests + { + [Fact] + public void PrefersRuntimeSpecificNativeDirectory() + { + var basePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + try + { + var nativeDirectory = Path.Combine(basePath, "runtimes", RuntimeInformation.RuntimeIdentifier, "native"); + Directory.CreateDirectory(nativeDirectory); + var fileName = OperatingSystem.IsWindows() ? "probe.dll" + : OperatingSystem.IsMacOS() ? "libprobe.dylib" + : "libprobe.so"; + var expected = Path.Combine(nativeDirectory, fileName); + File.WriteAllText(expected, ""); + + Assert.Equal(expected, ManagedLoadContext.GetRuntimeSpecificNativeLibraryPath(basePath, "probe")); + Assert.Null(ManagedLoadContext.GetRuntimeSpecificNativeLibraryPath(basePath, "missing")); + } + finally + { + if (Directory.Exists(basePath)) + { + Directory.Delete(basePath, recursive: true); + } + } + } + } +} diff --git a/test/TestProjects/Libv1/Libv1.csproj b/test/TestProjects/Libv1/Libv1.csproj index d4b6683..04248e8 100644 --- a/test/TestProjects/Libv1/Libv1.csproj +++ b/test/TestProjects/Libv1/Libv1.csproj @@ -1,9 +1,9 @@ - - - - net8.0 - 1.0.0.0 - Mylib - - - + + + + net8.0 + 1.0.0.0 + Mylib + + + diff --git a/test/TestProjects/Libv2/Libv2.csproj b/test/TestProjects/Libv2/Libv2.csproj index ccd5926..418068e 100644 --- a/test/TestProjects/Libv2/Libv2.csproj +++ b/test/TestProjects/Libv2/Libv2.csproj @@ -1,9 +1,9 @@ - - - - net8.0 - 2.0.0.0 - Mylib - - - + + + + net8.0 + 2.0.0.0 + Mylib + + + diff --git a/test/TestProjects/Libv3/Libv3.csproj b/test/TestProjects/Libv3/Libv3.csproj index 8c549eb..0bc0ab1 100644 --- a/test/TestProjects/Libv3/Libv3.csproj +++ b/test/TestProjects/Libv3/Libv3.csproj @@ -1,9 +1,9 @@ - - - - net8.0 - 3.0.0.0 - Mylib - - - + + + + net8.0 + 3.0.0.0 + Mylib + + + diff --git a/test/TestProjects/NativeDependency/NativeDependency.csproj b/test/TestProjects/NativeDependency/NativeDependency.csproj index b4c82a3..ba04eb3 100644 --- a/test/TestProjects/NativeDependency/NativeDependency.csproj +++ b/test/TestProjects/NativeDependency/NativeDependency.csproj @@ -1,11 +1,11 @@ - - - - net8.0 - - - - - - - + + + + net8.0 + + + + + + + diff --git a/test/TestProjects/WithOurPluginsPluginA/WithOurPluginsPluginA.csproj b/test/TestProjects/WithOurPluginsPluginA/WithOurPluginsPluginA.csproj index abb451f..d20507a 100644 --- a/test/TestProjects/WithOurPluginsPluginA/WithOurPluginsPluginA.csproj +++ b/test/TestProjects/WithOurPluginsPluginA/WithOurPluginsPluginA.csproj @@ -1,12 +1,12 @@ - - - - netstandard2.0 - false - - - - - - - + + + + netstandard2.0 + false + + + + + + + diff --git a/test/TestProjects/WithOurPluginsPluginB/WithOurPluginsPluginB.csproj b/test/TestProjects/WithOurPluginsPluginB/WithOurPluginsPluginB.csproj index abb451f..d20507a 100644 --- a/test/TestProjects/WithOurPluginsPluginB/WithOurPluginsPluginB.csproj +++ b/test/TestProjects/WithOurPluginsPluginB/WithOurPluginsPluginB.csproj @@ -1,12 +1,12 @@ - - - - netstandard2.0 - false - - - - - - - + + + + netstandard2.0 + false + + + + + + + diff --git a/test/TestProjects/WithOurPluginsPluginContract/WithOurPluginsPluginContract.csproj b/test/TestProjects/WithOurPluginsPluginContract/WithOurPluginsPluginContract.csproj index 72764a6..9f5c4f4 100644 --- a/test/TestProjects/WithOurPluginsPluginContract/WithOurPluginsPluginContract.csproj +++ b/test/TestProjects/WithOurPluginsPluginContract/WithOurPluginsPluginContract.csproj @@ -1,7 +1,7 @@ - - - - netstandard2.0 - - - + + + + netstandard2.0 + + + diff --git a/test/TestProjects/WithOwnPlugins/WithOwnPlugins.csproj b/test/TestProjects/WithOwnPlugins/WithOwnPlugins.csproj index 47bc79b..c46293d 100644 --- a/test/TestProjects/WithOwnPlugins/WithOwnPlugins.csproj +++ b/test/TestProjects/WithOwnPlugins/WithOwnPlugins.csproj @@ -1,15 +1,15 @@ - - - - net8.0 - - - - - - - - - - - + + + + net8.0 + + + + + + + + + + + diff --git a/test/TestProjects/WithOwnPluginsContract/WithOwnPluginsContract.csproj b/test/TestProjects/WithOwnPluginsContract/WithOwnPluginsContract.csproj index e9ddbf0..58990cd 100644 --- a/test/TestProjects/WithOwnPluginsContract/WithOwnPluginsContract.csproj +++ b/test/TestProjects/WithOwnPluginsContract/WithOwnPluginsContract.csproj @@ -1,7 +1,7 @@ - - - - net8.0 - - - + + + + net8.0 + + +