diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 3cdbf855c..84d3d8706 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -5,47 +5,23 @@ on: [ pull_request, push ]
jobs:
build-test:
name: Build and Test
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-latest
strategy:
+ fail-fast: false
matrix:
- python: [3.6,3.7,3.8,3.9]
- shutdown_mode: [Normal,Soft]
- toolset: [Mono,.NET]
- include:
- - toolset: .NET
- BUILD_OPTS: --xplat
- RUN_TESTS: dotnet
- EMBED_TESTS_PATH: netcoreapp3.1_publish/
- PERF_TESTS_PATH: net461/
- - toolset: Mono
- BUILD_OPTS: ""
- RUN_TESTS: "mono ./packages/NUnit.*/tools/nunit3-console.exe"
- EMBED_TESTS_PATH: ""
- PERF_TESTS_PATH: ""
-
+ python: [3.6, 3.7, 3.8, 3.9]
+ shutdown_mode: [Normal, Soft]
+
env:
- BUILD_OPTS: ${{ matrix.BUILD_OPTS }}
- RUN_TESTS: ${{ matrix.RUN_TESTS }}
- EMBED_TESTS_PATH: ${{ matrix.EMBED_TESTS_PATH }}
- PERF_TESTS_PATH: ${{ matrix.PERF_TESTS_PATH }}
PYTHONNET_SHUTDOWN_MODE: ${{ matrix.SHUTDOWN_MODE }}
steps:
- name: Checkout code
uses: actions/checkout@v2
- - name: Install Mono
- if: ${{ matrix.toolset == 'Mono' }}
- run: |
- sudo apt update
- sudo apt install mono-devel ca-certificates-mono -y
-
- - name: Install .NET
- if: ${{ matrix.toolset == '.NET' }}
+ - name: Setup .NET
uses: actions/setup-dotnet@v1
- with:
- dotnet-version: 3.1.x
- name: Set up Python ${{ matrix.python }}
uses: actions/setup-python@v2
@@ -54,16 +30,19 @@ jobs:
- name: Install dependencies
run: |
- pip install --upgrade setuptools # TEMP - due to setuptools 36.2.0 bug
pip install --upgrade -r requirements.txt
- - name: Install
+ - name: Build and Install
run: |
- echo $BUILD_OPTS
- python setup.py install $BUILD_OPTS
+ python setup.py configure
+ pip install -v .
- name: Python Tests
run: pytest
- - name: .NET Tests
- run: $RUN_TESTS src/embed_tests/bin/$EMBED_TESTS_PATH/Python.EmbeddingTest.dll --labels=All
+ - name: Run Embedding tests
+ run: dotnet test src/embed_tests/
+
+ # TODO: Run perf tests
+ # TODO: Run tests on macos and windows as well
+ # TODO: Run tests on Windows on .NET Framework
diff --git a/.gitignore b/.gitignore
index 87f7fe4ed..e40c8b709 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
/src/runtime/interopNative.cs
+# Configuration data
+configured.props
+
# General binaries and Build results
*.dll
*.exe
@@ -17,6 +20,7 @@ __pycache__/
build/
dist/
*.egg-info/
+.eggs/
# Unit test / coverage reports
htmlcov/
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 000000000..5ad0c0e77
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,17 @@
+
+
+ 3.0.0
+ Copyright (c) 2006-2020 The Contributors of the Python.NET Project
+ pythonnet
+ Python.NET
+ 7.3
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/NuGet.config b/NuGet.config
deleted file mode 100644
index 5210cd6c9..000000000
--- a/NuGet.config
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
index a91afdcba..1ad673ede 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -10,19 +10,11 @@ platform:
environment:
global:
- PYTHONUNBUFFERED: True
+ PYTHONUNBUFFERED: 'True'
PYTHONWARNINGS: 'ignore:::wheel.pep425tags:'
CODECOV_ENV: PYTHON_VERSION, PLATFORM
matrix:
- - PYTHON_VERSION: 3.9
- BUILD_OPTS: --xplat
- - PYTHON_VERSION: 3.8
- BUILD_OPTS: --xplat
- - PYTHON_VERSION: 3.7
- BUILD_OPTS: --xplat
- - PYTHON_VERSION: 3.6
- BUILD_OPTS: --xplat
- PYTHON_VERSION: 3.9
- PYTHON_VERSION: 3.8
- PYTHON_VERSION: 3.7
@@ -47,35 +39,18 @@ init:
install:
- python -m pip install -U pip
- pip install --upgrade -r requirements.txt --quiet
- - pip install pycparser --quiet
-
- # Install OpenCover. Can't put on `packages.config`, not Mono compatible
- - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet
build_script:
+ - python setup.py configure
# Create clean `sdist`. Only used for releases
- python setup.py --quiet sdist
- # Build `wheel` with coverage of `setup.py`
- - coverage run setup.py bdist_wheel %BUILD_OPTS%
+ - python setup.py bdist_wheel
test_script:
- pip install --no-index --find-links=.\dist\ pythonnet
- - ps: .\ci\appveyor_run_tests.ps1
-
-on_finish:
- # Temporary disable multiple upload due to codecov limit of 20 per commit.
- # https://docs.codecov.io/blog/week-8-2017
- - coverage xml -i
- # - codecov --file coverage.xml --flags setup_windows
- # - codecov --file py.coverage --flags python_tests
- # - codecov --file cs.coverage --flags embedded_tests
- - codecov --file py.coverage cs.coverage coverage.xml --flags setup_windows
+ #- ps: .\ci\appveyor_run_tests.ps1
+ - pytest
+ - dotnet test src/embed_tests/
artifacts:
- path: dist\*
- - path: '.\src\runtime\bin\*.nupkg'
-
-notifications:
- - provider: Slack
- incoming_webhook:
- secure: 2S/t6rGHdbwoxehnvn5KgfsHrBFEtwnPD7M5olGErmz70oWFVpqoWd/EvDwh7rKZGdOTjDmpwcukc2xi5VRaGHbBAqFYS3tAdgAMrcaTNWs=
diff --git a/clr.py b/clr.py
new file mode 100644
index 000000000..711333dd2
--- /dev/null
+++ b/clr.py
@@ -0,0 +1,41 @@
+"""
+Legacy Python.NET loader for backwards compatibility
+"""
+
+def _get_netfx_path():
+ import os, sys
+
+ if sys.maxsize > 2 ** 32:
+ arch = "amd64"
+ else:
+ arch = "x86"
+
+ return os.path.join(os.path.dirname(__file__), "pythonnet", "netfx", arch, "clr.pyd")
+
+
+def _get_mono_path():
+ import os, glob
+
+ paths = glob.glob(os.path.join(os.path.dirname(__file__), "pythonnet", "mono", "clr.*so"))
+ return paths[0]
+
+
+def _load_clr():
+ import sys
+ from importlib import util
+
+ if sys.platform == "win32":
+ path = _get_netfx_path()
+ else:
+ path = _get_mono_path()
+
+ del sys.modules[__name__]
+
+ spec = util.spec_from_file_location("clr", path)
+ clr = util.module_from_spec(spec)
+ spec.loader.exec_module(clr)
+
+ sys.modules[__name__] = clr
+
+
+_load_clr()
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..855db2223
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4", "pycparser"]
+build-backend = "setuptools.build_meta"
diff --git a/pythonnet.15.sln b/pythonnet.15.sln
deleted file mode 100644
index 76986c84f..000000000
--- a/pythonnet.15.sln
+++ /dev/null
@@ -1,403 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29102.190
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.PerformanceTests", "src\perf_tests\Python.PerformanceTests.csproj", "{6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Repo", "Repo", "{441A0123-F4C6-4EE4-9AEE-315FD79BE2D5}"
- ProjectSection(SolutionItems) = preProject
- .editorconfig = .editorconfig
- .gitignore = .gitignore
- CHANGELOG.md = CHANGELOG.md
- README.rst = README.rst
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CI", "CI", "{D301657F-5EAF-4534-B280-B858D651B2E5}"
- ProjectSection(SolutionItems) = preProject
- appveyor.yml = appveyor.yml
- ci\appveyor_build_recipe.ps1 = ci\appveyor_build_recipe.ps1
- ci\appveyor_run_tests.ps1 = ci\appveyor_run_tests.ps1
- .github\workflows\main.yml = .github\workflows\main.yml
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{57F5D701-F265-4736-A5A2-07249E7A4DA3}"
- ProjectSection(SolutionItems) = preProject
- setup.py = setup.py
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "conda.recipe", "conda.recipe", "{7FD2404D-0CE8-4645-8DFB-766470E2150E}"
- ProjectSection(SolutionItems) = preProject
- conda.recipe\bld.bat = conda.recipe\bld.bat
- conda.recipe\meta.yaml = conda.recipe\meta.yaml
- conda.recipe\README.md = conda.recipe\README.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{BC426F42-8494-4AA5-82C9-5109ACD97BD1}"
- ProjectSection(SolutionItems) = preProject
- tools\geninterop\geninterop.py = tools\geninterop\geninterop.py
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- DebugMono|Any CPU = DebugMono|Any CPU
- DebugMono|x64 = DebugMono|x64
- DebugMono|x86 = DebugMono|x86
- DebugMonoPY3|Any CPU = DebugMonoPY3|Any CPU
- DebugMonoPY3|x64 = DebugMonoPY3|x64
- DebugMonoPY3|x86 = DebugMonoPY3|x86
- DebugWin|Any CPU = DebugWin|Any CPU
- DebugWin|x64 = DebugWin|x64
- DebugWin|x86 = DebugWin|x86
- DebugWinPY3|Any CPU = DebugWinPY3|Any CPU
- DebugWinPY3|x64 = DebugWinPY3|x64
- DebugWinPY3|x86 = DebugWinPY3|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- ReleaseMono|Any CPU = ReleaseMono|Any CPU
- ReleaseMono|x64 = ReleaseMono|x64
- ReleaseMono|x86 = ReleaseMono|x86
- ReleaseMonoPY3|Any CPU = ReleaseMonoPY3|Any CPU
- ReleaseMonoPY3|x64 = ReleaseMonoPY3|x64
- ReleaseMonoPY3|x86 = ReleaseMonoPY3|x86
- ReleaseWin|Any CPU = ReleaseWin|Any CPU
- ReleaseWin|x64 = ReleaseWin|x64
- ReleaseWin|x86 = ReleaseWin|x86
- ReleaseWinPY3|Any CPU = ReleaseWinPY3|Any CPU
- ReleaseWinPY3|x64 = ReleaseWinPY3|x64
- ReleaseWinPY3|x86 = ReleaseWinPY3|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Debug|Any CPU.ActiveCfg = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Debug|Any CPU.Build.0 = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Debug|x64.ActiveCfg = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Debug|x64.Build.0 = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Debug|x86.ActiveCfg = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Debug|x86.Build.0 = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.Build.0 = DebugMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.Build.0 = DebugMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|Any CPU.ActiveCfg = DebugMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|Any CPU.Build.0 = DebugMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|Any CPU.ActiveCfg = DebugWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|Any CPU.Build.0 = DebugWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.Build.0 = DebugWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.Build.0 = DebugWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|Any CPU.ActiveCfg = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|Any CPU.Build.0 = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.Build.0 = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.Build.0 = DebugWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Release|Any CPU.ActiveCfg = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Release|Any CPU.Build.0 = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Release|x64.ActiveCfg = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Release|x64.Build.0 = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Release|x86.ActiveCfg = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.Release|x86.Build.0 = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.Build.0 = ReleaseMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.Build.0 = ReleaseMono|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|Any CPU.ActiveCfg = ReleaseMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|Any CPU.Build.0 = ReleaseMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|Any CPU.Build.0 = ReleaseWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|Any CPU.ActiveCfg = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|Any CPU.Build.0 = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|Any CPU
- {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|Any CPU
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Debug|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Debug|Any CPU.Build.0 = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Debug|x64.ActiveCfg = DebugWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Debug|x64.Build.0 = DebugWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Debug|x86.ActiveCfg = DebugWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Debug|x86.Build.0 = DebugWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|Any CPU.ActiveCfg = DebugMono|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.Build.0 = DebugMono|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.Build.0 = DebugMono|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|Any CPU.ActiveCfg = DebugMonoPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.Build.0 = DebugWin|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.Build.0 = DebugWin|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|Any CPU.ActiveCfg = DebugWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Release|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Release|Any CPU.Build.0 = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Release|x64.ActiveCfg = ReleaseWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Release|x64.Build.0 = ReleaseWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Release|x86.ActiveCfg = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.Release|x86.Build.0 = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|Any CPU.ActiveCfg = ReleaseMonoPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Debug|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Debug|Any CPU.Build.0 = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Debug|x64.ActiveCfg = DebugWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Debug|x64.Build.0 = DebugWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Debug|x86.ActiveCfg = DebugWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Debug|x86.Build.0 = DebugWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|Any CPU.ActiveCfg = DebugMono|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|Any CPU.ActiveCfg = DebugMonoPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.Build.0 = DebugWin|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.Build.0 = DebugWin|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|Any CPU.ActiveCfg = DebugWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Release|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Release|Any CPU.Build.0 = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Release|x64.ActiveCfg = ReleaseWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Release|x64.Build.0 = ReleaseWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Release|x86.ActiveCfg = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.Release|x86.Build.0 = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|Any CPU.ActiveCfg = ReleaseMonoPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Debug|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Debug|Any CPU.Build.0 = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Debug|x64.ActiveCfg = DebugWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Debug|x64.Build.0 = DebugWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Debug|x86.ActiveCfg = DebugWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Debug|x86.Build.0 = DebugWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|Any CPU.ActiveCfg = DebugMono|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.Build.0 = DebugMono|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.Build.0 = DebugMono|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|Any CPU.ActiveCfg = DebugMonoPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.Build.0 = DebugWin|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.Build.0 = DebugWin|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|Any CPU.ActiveCfg = DebugWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Release|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Release|Any CPU.Build.0 = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Release|x64.ActiveCfg = ReleaseWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Release|x64.Build.0 = ReleaseWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Release|x86.ActiveCfg = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.Release|x86.Build.0 = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|Any CPU.ActiveCfg = ReleaseMonoPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Debug|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Debug|Any CPU.Build.0 = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Debug|x64.ActiveCfg = DebugWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Debug|x64.Build.0 = DebugWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Debug|x86.ActiveCfg = DebugWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Debug|x86.Build.0 = DebugWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|Any CPU.ActiveCfg = DebugMono|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.Build.0 = DebugMono|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.Build.0 = DebugMono|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|Any CPU.ActiveCfg = DebugMonoPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.Build.0 = DebugWin|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.Build.0 = DebugWin|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|Any CPU.ActiveCfg = DebugWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Release|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Release|Any CPU.Build.0 = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Release|x64.ActiveCfg = ReleaseWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Release|x64.Build.0 = ReleaseWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Release|x86.ActiveCfg = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.Release|x86.Build.0 = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|Any CPU.ActiveCfg = ReleaseMonoPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Debug|Any CPU.ActiveCfg = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Debug|Any CPU.Build.0 = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Debug|x64.ActiveCfg = DebugWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Debug|x64.Build.0 = DebugWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Debug|x86.ActiveCfg = DebugWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Debug|x86.Build.0 = DebugWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMono|Any CPU.ActiveCfg = DebugMono|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMono|x64.Build.0 = DebugMono|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMono|x86.Build.0 = DebugMono|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMonoPY3|Any CPU.ActiveCfg = DebugMonoPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWin|x64.Build.0 = DebugWin|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWin|x86.Build.0 = DebugWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWinPY3|Any CPU.ActiveCfg = DebugWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Release|Any CPU.ActiveCfg = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Release|Any CPU.Build.0 = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Release|x64.ActiveCfg = ReleaseWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Release|x64.Build.0 = ReleaseWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Release|x86.ActiveCfg = ReleaseWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.Release|x86.Build.0 = ReleaseWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMonoPY3|Any CPU.ActiveCfg = ReleaseMonoPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWinPY3|Any CPU.ActiveCfg = ReleaseWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {6FB0D091-9CEC-4DCC-8701-C40F9BFC9EDE}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {A6347B90-BBE6-4E45-90BF-1BD8B76069E3}
- EndGlobalSection
-EndGlobal
diff --git a/pythonnet.sln b/pythonnet.sln
index c5afd66c3..fcad97d5c 100644
--- a/pythonnet.sln
+++ b/pythonnet.sln
@@ -1,202 +1,139 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Runtime", "src\runtime\Python.Runtime.csproj", "{097B4AC0-74E9-4C58-BCF8-C69746EC8271}"
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30717.126
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime", "src\runtime\Python.Runtime.csproj", "{4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Test", "src\testing\Python.Test.csproj", "{6F401A34-273B-450F-9A4C-13550BE0767B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console", "src\console\Console.csproj", "{E6B01706-00BA-4144-9029-186AC42FBE9A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.EmbeddingTest", "src\embed_tests\Python.EmbeddingTest.csproj", "{4165C59D-2822-499F-A6DB-EACA4C331EB5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule", "src\clrmodule\clrmodule.csproj", "{F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Console", "src\console\Console.csproj", "{E29DCF0A-5114-4A98-B1DD-71264B6EA349}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest", "src\embed_tests\Python.EmbeddingTest.csproj", "{819E089B-4770-400E-93C6-4F7A35F0EA12}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "clrmodule", "src\clrmodule\clrmodule.csproj", "{86E834DE-1139-4511-96CC-69636A56E7AC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test", "src\testing\Python.Test.csproj", "{14EF9518-5BB7-4F83-8686-015BD2CC788E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.PerformanceTests", "src\perf_tests\Python.PerformanceTests.csproj", "{4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Repo", "Repo", "{441A0123-F4C6-4EE4-9AEE-315FD79BE2D5}"
+ ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
+ .gitignore = .gitignore
+ CHANGELOG.md = CHANGELOG.md
+ README.rst = README.rst
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CI", "CI", "{D301657F-5EAF-4534-B280-B858D651B2E5}"
+ ProjectSection(SolutionItems) = preProject
+ appveyor.yml = appveyor.yml
+ ci\appveyor_build_recipe.ps1 = ci\appveyor_build_recipe.ps1
+ ci\appveyor_run_tests.ps1 = ci\appveyor_run_tests.ps1
+ .github\workflows\main.yml = .github\workflows\main.yml
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{57F5D701-F265-4736-A5A2-07249E7A4DA3}"
+ ProjectSection(SolutionItems) = preProject
+ setup.py = setup.py
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "conda.recipe", "conda.recipe", "{7FD2404D-0CE8-4645-8DFB-766470E2150E}"
+ ProjectSection(SolutionItems) = preProject
+ conda.recipe\bld.bat = conda.recipe\bld.bat
+ conda.recipe\meta.yaml = conda.recipe\meta.yaml
+ conda.recipe\README.md = conda.recipe\README.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{BC426F42-8494-4AA5-82C9-5109ACD97BD1}"
+ ProjectSection(SolutionItems) = preProject
+ tools\geninterop\geninterop.py = tools\geninterop\geninterop.py
+ EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- DebugMono|x64 = DebugMono|x64
- DebugMono|x86 = DebugMono|x86
- DebugMonoPY3|x64 = DebugMonoPY3|x64
- DebugMonoPY3|x86 = DebugMonoPY3|x86
- DebugWin|x64 = DebugWin|x64
- DebugWin|x86 = DebugWin|x86
- DebugWinPY3|x64 = DebugWinPY3|x64
- DebugWinPY3|x86 = DebugWinPY3|x86
- ReleaseMono|x64 = ReleaseMono|x64
- ReleaseMono|x86 = ReleaseMono|x86
- ReleaseMonoPY3|x64 = ReleaseMonoPY3|x64
- ReleaseMonoPY3|x86 = ReleaseMonoPY3|x86
- ReleaseWin|x64 = ReleaseWin|x64
- ReleaseWin|x86 = ReleaseWin|x86
- ReleaseWinPY3|x64 = ReleaseWinPY3|x64
- ReleaseWinPY3|x86 = ReleaseWinPY3|x86
+ 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
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.Build.0 = DebugMono|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.Build.0 = DebugMono|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.Build.0 = DebugWin|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.Build.0 = DebugWin|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.Build.0 = DebugMono|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x86.Build.0 = DebugMono|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x64.Build.0 = DebugWin|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x86.Build.0 = DebugWin|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x64.Build.0 = DebugMono|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x86.Build.0 = DebugMono|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x64.Build.0 = DebugWin|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x86.Build.0 = DebugWin|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.Build.0 = DebugMono|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.Build.0 = DebugMono|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.Build.0 = DebugWin|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.Build.0 = DebugWin|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.Build.0 = ReleaseMono|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.Build.0 = ReleaseMono|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x64.ActiveCfg = DebugMono|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x86.ActiveCfg = DebugMono|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.ActiveCfg = DebugWin|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.Build.0 = DebugWin|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x86.ActiveCfg = DebugWin|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x86.Build.0 = DebugWin|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86
- {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Debug|x64.Build.0 = Debug|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Debug|x86.Build.0 = Debug|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Release|x64.ActiveCfg = Release|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Release|x64.Build.0 = Release|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Release|x86.ActiveCfg = Release|Any CPU
+ {4E8C8FE2-0FB8-4517-B2D9-5FB2D5FC849B}.Release|x86.Build.0 = Release|Any CPU
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Debug|Any CPU.Build.0 = Debug|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Debug|x64.ActiveCfg = Debug|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Debug|x64.Build.0 = Debug|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Debug|x86.ActiveCfg = Debug|x86
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Debug|x86.Build.0 = Debug|x86
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Release|Any CPU.ActiveCfg = Release|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Release|Any CPU.Build.0 = Release|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Release|x64.ActiveCfg = Release|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Release|x64.Build.0 = Release|x64
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Release|x86.ActiveCfg = Release|x86
+ {E6B01706-00BA-4144-9029-186AC42FBE9A}.Release|x86.Build.0 = Release|x86
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Debug|x64.Build.0 = Debug|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Debug|x86.Build.0 = Debug|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Release|x64.ActiveCfg = Release|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Release|x64.Build.0 = Release|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Release|x86.ActiveCfg = Release|Any CPU
+ {F9F5FA13-BC52-4C0B-BC1C-FE3C0B8FCCDD}.Release|x86.Build.0 = Release|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Debug|x64.Build.0 = Debug|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Debug|x86.Build.0 = Debug|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Release|Any CPU.Build.0 = Release|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Release|x64.ActiveCfg = Release|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Release|x64.Build.0 = Release|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Release|x86.ActiveCfg = Release|Any CPU
+ {819E089B-4770-400E-93C6-4F7A35F0EA12}.Release|x86.Build.0 = Release|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Debug|x64.Build.0 = Debug|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Debug|x86.Build.0 = Debug|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Release|x64.ActiveCfg = Release|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Release|x64.Build.0 = Release|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Release|x86.ActiveCfg = Release|Any CPU
+ {14EF9518-5BB7-4F83-8686-015BD2CC788E}.Release|x86.Build.0 = Release|Any CPU
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Debug|Any CPU.Build.0 = Debug|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Debug|x64.ActiveCfg = Debug|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Debug|x64.Build.0 = Debug|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Debug|x86.ActiveCfg = Debug|x86
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Debug|x86.Build.0 = Debug|x86
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Release|Any CPU.ActiveCfg = Release|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Release|Any CPU.Build.0 = Release|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Release|x64.ActiveCfg = Release|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Release|x64.Build.0 = Release|x64
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Release|x86.ActiveCfg = Release|x86
+ {4F2EA4A1-7ECA-48B5-8077-7A3C366F9931}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = src\console\Console.csproj
- Policies = $0
- $0.VersionControlPolicy = $1
- $1.inheritsSet = Mono
- $0.ChangeLogPolicy = $2
- $2.UpdateMode = None
- $2.MessageStyle = $3
- $3.LineAlign = 0
- $2.inheritsSet = Mono
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {C8845072-C642-4858-8627-27E862AD21BB}
EndGlobalSection
EndGlobal
diff --git a/pythonnet/.gitignore b/pythonnet/.gitignore
new file mode 100644
index 000000000..7ebf7884b
--- /dev/null
+++ b/pythonnet/.gitignore
@@ -0,0 +1,3 @@
+mono/
+netfx/
+runtime/
diff --git a/pythonnet/__init__.py b/pythonnet/__init__.py
new file mode 100644
index 000000000..5c197e146
--- /dev/null
+++ b/pythonnet/__init__.py
@@ -0,0 +1,3 @@
+def get_assembly_path():
+ import os
+ return os.path.dirname(__file__) + "/runtime/Python.Runtime.dll"
diff --git a/requirements.txt b/requirements.txt
index 78570cb95..e0e465bd1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,11 +1,13 @@
# Requirements for both Travis and AppVeyor
pytest
-coverage
psutil
# Coverage upload
+coverage
codecov
# Platform specific requirements
wheel
pycparser
+setuptools
+setuptools_scm
diff --git a/setup.py b/setup.py
index 0b352b8af..26937817b 100644
--- a/setup.py
+++ b/setup.py
@@ -1,156 +1,18 @@
#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-Setup script for building clr.pyd and dependencies using mono and into
-an egg or wheel.
-"""
+from setuptools import setup, Command, Extension
+from wheel.bdist_wheel import bdist_wheel
+from setuptools.command.build_ext import build_ext
+import distutils
+from distutils.command import build
+from subprocess import check_output, check_call
-import collections
-import fnmatch
-import glob
-import os
-import subprocess
-import sys
-import sysconfig
-from distutils import spawn
-from distutils.command import install, build, build_ext, install_data, install_lib
+import sys, os
-from setuptools import Extension, setup
-
-try:
- from wheel import bdist_wheel
-except ImportError:
- bdist_wheel = None
-
-# Allow config/verbosity to be set from cli
-# http://stackoverflow.com/a/4792601/5208670
-CONFIG = "Release" # Release or Debug
-VERBOSITY = "normal" # quiet, minimal, normal, detailed, diagnostic
-
-is_64bits = sys.maxsize > 2 ** 32
-DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono"
-ARCH = "x64" if is_64bits else "x86"
PY_MAJOR = sys.version_info[0]
PY_MINOR = sys.version_info[1]
-###############################################################################
-# Windows Keys Constants for MSBUILD tools
-RegKey = collections.namedtuple("RegKey", "sdk_name key value_name suffix")
-vs_python = "Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\WinSDK"
-vs_root = "SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\{0}"
-sdks_root = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v{0}Win32Tools"
-kits_root = "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots"
-kits_suffix = os.path.join("bin", ARCH)
-
-WIN_SDK_KEYS = [
- RegKey(
- sdk_name="Windows Kit 10.0",
- key=kits_root,
- value_name="KitsRoot10",
- suffix=os.path.join("bin", "10.0.16299.0", ARCH),
- ),
- RegKey(
- sdk_name="Windows Kit 10.0",
- key=kits_root,
- value_name="KitsRoot10",
- suffix=os.path.join("bin", "10.0.15063.0", ARCH),
- ),
- RegKey(
- sdk_name="Windows Kit 10.0",
- key=kits_root,
- value_name="KitsRoot10",
- suffix=kits_suffix,
- ),
- RegKey(
- sdk_name="Windows Kit 8.1",
- key=kits_root,
- value_name="KitsRoot81",
- suffix=kits_suffix,
- ),
- RegKey(
- sdk_name="Windows Kit 8.0",
- key=kits_root,
- value_name="KitsRoot",
- suffix=kits_suffix,
- ),
- RegKey(
- sdk_name="Windows SDK 7.1A",
- key=sdks_root.format("7.1A\\WinSDK-"),
- value_name="InstallationFolder",
- suffix="",
- ),
- RegKey(
- sdk_name="Windows SDK 7.1",
- key=sdks_root.format("7.1\\WinSDK"),
- value_name="InstallationFolder",
- suffix="",
- ),
- RegKey(
- sdk_name="Windows SDK 7.0A",
- key=sdks_root.format("7.0A\\WinSDK-"),
- value_name="InstallationFolder",
- suffix="",
- ),
- RegKey(
- sdk_name="Windows SDK 7.0",
- key=sdks_root.format("7.0\\WinSDK"),
- value_name="InstallationFolder",
- suffix="",
- ),
- RegKey(
- sdk_name="Windows SDK 6.0A",
- key=sdks_root.format("6.0A\\WinSDK"),
- value_name="InstallationFolder",
- suffix="",
- ),
-]
-
-VS_KEYS = (
- RegKey(
- sdk_name="MSBuild 15",
- key=vs_root.format("15.0"),
- value_name="MSBuildToolsPath",
- suffix="",
- ),
- RegKey(
- sdk_name="MSBuild 14",
- key=vs_root.format("14.0"),
- value_name="MSBuildToolsPath",
- suffix="",
- ),
- RegKey(
- sdk_name="MSBuild 12",
- key=vs_root.format("12.0"),
- value_name="MSBuildToolsPath",
- suffix="",
- ),
- RegKey(
- sdk_name="MSBuild 4",
- key=vs_root.format("4.0"),
- value_name="MSBuildToolsPath",
- suffix="",
- ),
- RegKey(
- sdk_name="MSBuild 3.5",
- key=vs_root.format("3.5"),
- value_name="MSBuildToolsPath",
- suffix="",
- ),
- RegKey(
- sdk_name="MSBuild 2.0",
- key=vs_root.format("2.0"),
- value_name="MSBuildToolsPath",
- suffix="",
- ),
-)
-
-
-###############################################################################
-def _check_output(*args, **kwargs):
- """Check output wrapper for py2/py3 compatibility"""
- output = subprocess.check_output(*args, **kwargs)
- return output.decode("ascii")
+CONFIGURED_PROPS = "configured.props"
def _get_interop_filename():
@@ -165,466 +27,203 @@ def _get_interop_filename():
return os.path.join("src", "runtime", interop_filename)
-def _get_source_files():
- """Walk project and collect the files needed for ext_module"""
- for ext in (".sln",):
- for path in glob.glob("*" + ext):
- yield path
+# Write configuration to configured.props. This will go away once all of these
+# can be decided at runtime.
+def _write_configure_props():
+ defines = [
+ "PYTHON{0}{1}".format(PY_MAJOR, PY_MINOR),
+ ]
- for root, dirnames, filenames in os.walk("src"):
- for ext in (".cs", ".csproj", ".snk", ".config", ".py", ".c", ".h", ".ico"):
- for filename in fnmatch.filter(filenames, "*" + ext):
- yield os.path.join(root, filename)
+ if sys.platform == "win32":
+ defines.append("WINDOWS")
- for root, dirnames, filenames in os.walk("tools"):
- for ext in (".exe", ".py", ".c", ".h"):
- for filename in fnmatch.filter(filenames, "*" + ext):
- yield os.path.join(root, filename)
+ if hasattr(sys, "abiflags"):
+ if "d" in sys.abiflags:
+ defines.append("PYTHON_WITH_PYDEBUG")
+ if "m" in sys.abiflags:
+ defines.append("PYTHON_WITH_PYMALLOC")
+ # check the interop file exists, and create it if it doesn't
+ interop_file = _get_interop_filename()
+ if not os.path.exists(interop_file):
+ print("Creating {0}".format(interop_file))
+ geninterop = os.path.join("tools", "geninterop", "geninterop.py")
+ check_call([sys.executable, geninterop, interop_file])
-def _get_long_description():
- """Helper to populate long_description for pypi releases"""
- return open("README.rst").read()
+ import xml.etree.ElementTree as ET
+ proj = ET.Element("Project")
+ props = ET.SubElement(proj, "PropertyGroup")
+ f = ET.SubElement(props, "PythonInteropFile")
+ f.text = os.path.basename(interop_file)
-def _update_xlat_devtools():
- global DEVTOOLS
- if DEVTOOLS == "MsDev":
- DEVTOOLS = "MsDev15"
- elif DEVTOOLS == "Mono":
- DEVTOOLS = "dotnet"
+ c = ET.SubElement(props, "ConfiguredConstants")
+ c.text = " ".join(defines)
+ ET.ElementTree(proj).write(CONFIGURED_PROPS)
-def _collect_installed_windows_kits_v10(winreg):
- """Adds the installed Windows 10 kits to WIN_SDK_KEYS """
- global WIN_SDK_KEYS
- installed_kits = []
- with winreg.OpenKey(
- winreg.HKEY_LOCAL_MACHINE, kits_root, 0, winreg.KEY_READ
- ) as key:
- i = 0
- while True:
- try:
- installed_kits.append(winreg.EnumKey(key, i))
- i += 1
- except WindowsError:
- break
+class configure(Command):
+ """Configure command"""
- def make_reg_key(version):
- return RegKey(
- sdk_name="Windows Kit 10.0",
- key=kits_root,
- value_name="KitsRoot10",
- suffix=os.path.join("bin", version, ARCH),
- )
+ description = "Configure the pythonnet build"
+ user_options = []
- WIN_SDK_KEYS += [make_reg_key(e) for e in installed_kits if e.startswith("10.")]
+ def initialize_options(self):
+ pass
- # Make sure this function won't be called again
- _collect_installed_windows_kits_v10 = lambda: None
+ def finalize_options(self):
+ pass
+ def run(self):
+ self.announce("Writing configured.props...", level=distutils.log.INFO)
+ _write_configure_props()
-class BuildExtPythonnet(build_ext.build_ext):
- user_options = build_ext.build_ext.user_options + [("xplat", None, None)]
- def initialize_options(self):
- build_ext.build_ext.initialize_options(self)
- self.xplat = None
+class DotnetLib:
+ def __init__(self, name, path, **kwargs):
+ self.name = name
+ self.path = path
+ self.args = kwargs
- def finalize_options(self):
- build_ext.build_ext.finalize_options(self)
-
- def build_extension(self, ext):
- if self.xplat:
- _update_xlat_devtools()
-
- """Builds the .pyd file using msbuild or xbuild"""
- if ext.name != "clr":
- return build_ext.build_ext.build_extension(self, ext)
-
- # install packages using nuget
- self._install_packages()
-
- dest_file = self.get_ext_fullpath(ext.name)
- dest_dir = os.path.dirname(dest_file)
- if not os.path.exists(dest_dir):
- os.makedirs(dest_dir)
-
- defines = [
- "PYTHON{0}{1}".format(PY_MAJOR, PY_MINOR),
- ]
-
- if CONFIG == "Debug":
- defines.extend(["DEBUG", "TRACE"])
-
- if sys.platform != "win32" and (DEVTOOLS == "Mono" or DEVTOOLS == "dotnet"):
- on_darwin = sys.platform == "darwin"
-
- # Check if --enable-shared was set when Python was built
- enable_shared = sysconfig.get_config_var("Py_ENABLE_SHARED")
- if enable_shared:
- # Double-check if libpython is linked dynamically with python
- ldd_cmd = ["otool", "-L"] if on_darwin else ["ldd"]
- lddout = _check_output(ldd_cmd + [sys.executable])
- if "libpython" not in lddout:
- enable_shared = False
-
- if not enable_shared:
- defines.append("PYTHON_WITHOUT_ENABLE_SHARED")
-
- if sys.platform == "win32":
- defines.append("WINDOWS")
-
- if hasattr(sys, "abiflags"):
- if "d" in sys.abiflags:
- defines.append("PYTHON_WITH_PYDEBUG")
- if "m" in sys.abiflags:
- defines.append("PYTHON_WITH_PYMALLOC")
-
- # check the interop file exists, and create it if it doesn't
- interop_file = _get_interop_filename()
- if not os.path.exists(interop_file):
- self.debug_print("Creating {0}".format(interop_file))
- geninterop = os.path.join("tools", "geninterop", "geninterop.py")
- subprocess.check_call([sys.executable, geninterop, interop_file])
-
- if DEVTOOLS == "MsDev":
- _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe"))
- _config = "{0}Win".format(CONFIG)
- _solution_file = "pythonnet.sln"
- _custom_define_constants = False
- elif DEVTOOLS == "MsDev15":
- _xbuild = '"{0}"'.format(self._find_msbuild_tool_15())
- _config = "{0}Win".format(CONFIG)
- _solution_file = "pythonnet.15.sln"
- _custom_define_constants = True
- elif DEVTOOLS == "Mono":
- _xbuild = "xbuild"
- _config = "{0}Mono".format(CONFIG)
- _solution_file = "pythonnet.sln"
- _custom_define_constants = False
- elif DEVTOOLS == "dotnet":
- _xbuild = "dotnet msbuild"
- _config = "{0}Mono".format(CONFIG)
- _solution_file = "pythonnet.15.sln"
- _custom_define_constants = True
- else:
- raise NotImplementedError(
- "DevTool {0} not supported (use MsDev/MsDev15/Mono/dotnet)".format(
- DEVTOOLS
- )
- )
- cmd = [
- _xbuild,
- _solution_file,
- "/p:Configuration={}".format(_config),
- "/p:Platform={}".format(ARCH),
- '/p:{}DefineConstants="{}"'.format(
- "Custom" if _custom_define_constants else "", "%3B".join(defines)
- ),
- '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)),
- '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)),
- "/p:PackageId=pythonnet_py{0}{1}_{2}".format(PY_MAJOR, PY_MINOR, ARCH),
- "/verbosity:{}".format(VERBOSITY),
- ]
-
- manifest = self._get_manifest(dest_dir)
- if manifest:
- cmd.append('/p:PythonManifest="{0}"'.format(manifest))
-
- self.debug_print("Building: {0}".format(" ".join(cmd)))
- use_shell = True if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" else False
-
- subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell)
- subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell)
- if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet":
- subprocess.check_call(
- " ".join(
- cmd
- + [
- '"/t:Console_15:publish;Python_EmbeddingTest_15:publish"',
- "/p:TargetFramework=netcoreapp3.1",
- ]
- ),
- shell=use_shell,
- )
- subprocess.check_call(
- " ".join(
- cmd
- + [
- '"/t:Python_PerformanceTests:publish"',
- "/p:TargetFramework=net461",
- ]
- ),
- shell=use_shell,
- )
- if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet":
- self._build_monoclr()
-
- def _get_manifest(self, build_dir):
- if DEVTOOLS != "MsDev" and DEVTOOLS != "MsDev15":
- return
- mt = self._find_msbuild_tool("mt.exe", use_windows_sdk=True)
- manifest = os.path.abspath(os.path.join(build_dir, "app.manifest"))
- cmd = [
- mt,
- '-inputresource:"{0}"'.format(sys.executable),
- '-out:"{0}"'.format(manifest),
- ]
- self.debug_print("Extracting manifest from {}".format(sys.executable))
- subprocess.check_call(" ".join(cmd), shell=False)
- return manifest
-
- def _build_monoclr(self):
- try:
- mono_libs = _check_output("pkg-config --libs mono-2", shell=True)
- except:
- if DEVTOOLS == "dotnet":
- print("Skipping building monoclr module...")
- return
- raise
- mono_cflags = _check_output("pkg-config --cflags mono-2", shell=True)
- cflags = mono_cflags.strip()
- libs = mono_libs.strip()
-
- # build the clr python module
- clr_ext = Extension(
- "clr",
- language="c++",
- sources=["src/monoclr/pynetinit.c", "src/monoclr/clrmod.c"],
- extra_compile_args=cflags.split(" "),
- extra_link_args=libs.split(" "),
- )
-
- build_ext.build_ext.build_extension(self, clr_ext)
-
- def _install_packages(self):
- """install packages using nuget"""
- use_shell = DEVTOOLS == "Mono" or DEVTOOLS == "dotnet"
-
- if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet":
- if DEVTOOLS == "MsDev15":
- _config = "{0}Win".format(CONFIG)
- elif DEVTOOLS == "dotnet":
- _config = "{0}Mono".format(CONFIG)
-
- cmd = "dotnet msbuild /t:Restore pythonnet.15.sln /p:Configuration={0} /p:Platform={1}".format(
- _config, ARCH
- )
- self.debug_print("Updating packages with xplat: {0}".format(cmd))
- subprocess.check_call(cmd, shell=use_shell)
- else:
- nuget = os.path.join("tools", "nuget", "nuget.exe")
-
- if DEVTOOLS == "Mono":
- nuget = "mono {0}".format(nuget)
-
- cmd = "{0} update -self".format(nuget)
- self.debug_print("Updating NuGet: {0}".format(cmd))
- subprocess.check_call(cmd, shell=use_shell)
-
- try:
- # msbuild=14 is mainly for Mono issues
- cmd = "{0} restore pythonnet.sln -MSBuildVersion 14 -o packages".format(
- nuget
- )
- self.debug_print("Installing packages: {0}".format(cmd))
- subprocess.check_call(cmd, shell=use_shell)
- except:
- # when only VS 2017 is installed do not specify msbuild version
- cmd = "{0} restore pythonnet.sln -o packages".format(nuget)
- self.debug_print("Installing packages: {0}".format(cmd))
- subprocess.check_call(cmd, shell=use_shell)
-
- def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False):
- """Return full path to one of the Microsoft build tools"""
-
- # trying to search path with help of vswhere when MSBuild 15.0 and higher installed.
- if tool == "msbuild.exe" and use_windows_sdk == False:
- try:
- basePaths = subprocess.check_output(
- [
- "tools\\vswhere\\vswhere.exe",
- "-latest",
- "-version",
- "[15.0,)",
- "-requires",
- "Microsoft.Component.MSBuild",
- "-find",
- "MSBuild\**\Bin\MSBuild.exe",
- ]
- ).splitlines()
- if len(basePaths):
- return basePaths[0].decode(sys.stdout.encoding or "utf-8")
- except:
- pass # keep trying to search by old method.
-
- # Search in PATH first
- path = spawn.find_executable(tool)
- if path:
- return path
-
- # Search within registry to find build tools
- import winreg
-
- _collect_installed_windows_kits_v10(winreg)
-
- keys_to_check = WIN_SDK_KEYS if use_windows_sdk else VS_KEYS
- hklm = winreg.HKEY_LOCAL_MACHINE
- for rkey in keys_to_check:
- try:
- with winreg.OpenKey(hklm, rkey.key) as hkey:
- val, type_ = winreg.QueryValueEx(hkey, rkey.value_name)
- if type_ != winreg.REG_SZ:
- continue
- path = os.path.join(val, rkey.suffix, tool)
- if os.path.exists(path):
- self.debug_print(
- "Using {0} from {1}".format(tool, rkey.sdk_name)
- )
- return path
- except WindowsError:
- # Key doesn't exist
- pass
-
- # Add Visual C++ for Python as a fall-back in case one
- # of the other Windows SDKs isn't installed.
- # TODO: Extend checking by using setuptools/msvc.py?
- if use_windows_sdk:
- sdk_name = "Visual C++ for Python"
- localappdata = os.environ["LOCALAPPDATA"]
- suffix = "Bin\\x64" if ARCH == "x64" else "Bin"
- path = os.path.join(localappdata, vs_python, suffix, tool)
- if os.path.exists(path):
- self.debug_print("Using {0} from {1}".format(tool, sdk_name))
- return path
-
- raise RuntimeError("{0} could not be found".format(tool))
-
- def _find_msbuild_tool_15(self):
- """Return full path to one of the Microsoft build tools"""
- try:
- basePaths = subprocess.check_output(
- [
- "tools\\vswhere\\vswhere.exe",
- "-latest",
- "-version",
- "[15.0,)",
- "-requires",
- "Microsoft.Component.MSBuild",
- "-find",
- "MSBuild\**\Bin\MSBuild.exe",
- ]
- ).splitlines()
- if len(basePaths):
- return basePaths[0].decode(sys.stdout.encoding or "utf-8")
- else:
- raise RuntimeError("MSBuild >=15.0 could not be found.")
- except subprocess.CalledProcessError as e:
- raise RuntimeError(
- "MSBuild >=15.0 could not be found. {0}".format(e.output)
- )
+class build_dotnet(Command):
+ """Build command for dotnet-cli based builds"""
+ description = "Build DLLs with dotnet-cli"
+ user_options = [("dotnet-config", None, "dotnet build configuration")]
-class InstallLibPythonnet(install_lib.install_lib):
- def install(self):
- if not os.path.isdir(self.build_dir):
- self.warn(
- "'{0}' does not exist -- no Python modules"
- " to install".format(self.build_dir)
- )
- return
+ def initialize_options(self):
+ self.dotnet_config = None
+ self.build_lib = None
- if not os.path.exists(self.install_dir):
- self.mkpath(self.install_dir)
+ def finalize_options(self):
+ if self.dotnet_config is None:
+ self.dotnet_config = "release"
+
+ build = self.distribution.get_command_obj("build")
+ build.ensure_finalized()
+ self.build_lib = build.build_lib
- # only copy clr.pyd/.so
- for srcfile in glob.glob(os.path.join(self.build_dir, "clr.*")):
- destfile = os.path.join(self.install_dir, os.path.basename(srcfile))
- self.copy_file(srcfile, destfile)
+ def run(self):
+ dotnet_modules = self.distribution.dotnet_libs
+ self.run_command("configure")
+ for lib in dotnet_modules:
+ output = os.path.join(os.path.abspath(self.build_lib), lib.args.pop("output"))
+ rename = lib.args.pop("rename", {})
-class InstallDataPythonnet(install_data.install_data):
- def run(self):
- build_cmd = self.get_finalized_command("build_ext")
- install_cmd = self.get_finalized_command("install")
- build_lib = os.path.abspath(build_cmd.build_lib)
- install_platlib = os.path.relpath(install_cmd.install_platlib, self.install_dir)
+ opts = sum(
+ [
+ ["--" + name.replace("_", "-"), value]
+ for name, value in lib.args.items()
+ ],
+ [],
+ )
- for i, data_files in enumerate(self.data_files):
- if isinstance(data_files, str):
- self.data_files[i] = data_files[i].format(build_lib=build_lib)
- else:
- for j, filename in enumerate(data_files[1]):
- data_files[1][j] = filename.format(build_lib=build_lib)
- dest = data_files[0].format(install_platlib=install_platlib)
- self.data_files[i] = dest, data_files[1]
+ opts.extend(["--configuration", self.dotnet_config])
+ opts.extend(["--output", output])
- return install_data.install_data.run(self)
+ self.announce("Running dotnet build...", level=distutils.log.INFO)
+ self.spawn(["dotnet", "build", lib.path] + opts)
+ for k, v in rename.items():
+ source = os.path.join(output, k)
+ dest = os.path.join(output, v)
-class InstallPythonnet(install.install):
- user_options = install.install.user_options + [("xplat", None, None)]
+ if os.path.isfile(source):
+ try:
+ os.remove(dest)
+ except OSError:
+ pass
- def initialize_options(self):
- install.install.initialize_options(self)
- self.xplat = None
+ self.move_file(src=source, dst=dest, level=distutils.log.INFO)
+ else:
+ self.warn("Can't find file to rename: {}, current dir: {}".format(source, os.getcwd()))
- def finalize_options(self):
- install.install.finalize_options(self)
+# Add build_dotnet to the build tasks:
+from distutils.command.build import build as _build
+from setuptools import Distribution
- def run(self):
- if self.xplat:
- _update_xlat_devtools()
- return install.install.run(self)
+class build(_build):
+ sub_commands = _build.sub_commands + [('build_dotnet', None)]
-if bdist_wheel:
- class BDistWheelPythonnet(bdist_wheel.bdist_wheel):
- user_options = bdist_wheel.bdist_wheel.user_options + [("xplat", None, None)]
+Distribution.dotnet_libs = None
- def initialize_options(self):
- bdist_wheel.bdist_wheel.initialize_options(self)
- self.xplat = None
- def finalize_options(self):
- bdist_wheel.bdist_wheel.finalize_options(self)
+with open("README.rst", "r") as f:
+ long_description = f.read()
- def run(self):
- if self.xplat:
- _update_xlat_devtools()
- return bdist_wheel.bdist_wheel.run(self)
- ###############################################################################
+dotnet_libs = [
+ DotnetLib(
+ "python-runtime",
+ "src/runtime/Python.Runtime.csproj",
+ output="pythonnet/runtime"
+ ),
+ DotnetLib(
+ "clrmodule-amd64",
+ "src/clrmodule/",
+ runtime="win-x64",
+ output="pythonnet/netfx/amd64",
+ rename={"clr.dll": "clr.pyd"},
+ ),
+ DotnetLib(
+ "clrmodule-x86",
+ "src/clrmodule/",
+ runtime="win-x86",
+ output="pythonnet/netfx/x86",
+ rename={"clr.dll": "clr.pyd"},
+ ),
+]
+ext_modules = []
+
+try:
+ mono_libs = check_output("pkg-config --libs mono-2", shell=True, encoding="utf8")
+ mono_cflags = check_output(
+ "pkg-config --cflags mono-2", shell=True, encoding="utf8"
+ )
+ cflags = mono_cflags.strip()
+ libs = mono_libs.strip()
+
+ # build the clr python module
+ clr_ext = Extension(
+ "clr",
+ language="c++",
+ sources=["src/monoclr/clrmod.c"],
+ extra_compile_args=cflags.split(" "),
+ extra_link_args=libs.split(" "),
+ )
+ ext_modules.append(clr_ext)
+except Exception:
+ print("Failed to find mono libraries via pkg-config, skipping the Mono CLR loader")
-setupdir = os.path.dirname(__file__)
-if setupdir:
- os.chdir(setupdir)
-cmdclass={
- "install": InstallPythonnet,
- "build_ext": BuildExtPythonnet,
- "install_lib": InstallLibPythonnet,
- "install_data": InstallDataPythonnet,
-}
-if bdist_wheel:
- cmdclass["bdist_wheel"] = BDistWheelPythonnet
setup(
+ cmdclass={
+ "build": build,
+ "build_dotnet": build_dotnet,
+ "configure": configure,
+ },
+
name="pythonnet",
- version="3.0.0dev1",
+ version="3.0.0.dev1",
description=".Net and Mono integration for Python",
url="https://pythonnet.github.io/",
license="MIT",
author="The Contributors of the Python.NET Project",
author_email="pythonnet@python.org",
+ packages=["pythonnet"],
+ setup_requires=["setuptools_scm"],
install_requires=["pycparser"],
- long_description=_get_long_description(),
- ext_modules=[Extension("clr", sources=list(_get_source_files()))],
- data_files=[("{install_platlib}", ["{build_lib}/Python.Runtime.dll"])],
- cmdclass=cmdclass,
+ long_description=long_description,
+ # data_files=[("{install_platlib}", ["{build_lib}/pythonnet"])],
+
+ py_modules=["clr"],
+ ext_modules=ext_modules,
+ dotnet_libs=dotnet_libs,
classifiers=[
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
diff --git a/src/SharedAssemblyInfo.cs b/src/SharedAssemblyInfo.cs
deleted file mode 100644
index ab79c56eb..000000000
--- a/src/SharedAssemblyInfo.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using System.Reflection;
-using System.Resources;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("pythonnet")]
-[assembly: AssemblyProduct("Python.NET")]
-[assembly: AssemblyCopyright("Copyright (c) 2006-2020 the contributors of the Python.NET project")]
-[assembly: AssemblyTrademark("")]
-
-[assembly: AssemblyCulture("")]
-[assembly: NeutralResourcesLanguage("")]
-
-[assembly: CLSCompliant(true)]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// Version Information. Keeping it simple. May need to revisit for Nuget
-// See: https://codingforsmarties.wordpress.com/2016/01/21/how-to-version-assemblies-destined-for-nuget/
-// AssemblyVersion can only be numeric
-[assembly: AssemblyVersion("3.0.0")]
diff --git a/src/clrmodule/ClrModule.cs b/src/clrmodule/ClrModule.cs
index e19e58594..7b0387d46 100644
--- a/src/clrmodule/ClrModule.cs
+++ b/src/clrmodule/ClrModule.cs
@@ -26,7 +26,7 @@
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
-using RGiesecke.DllExport;
+using NXPorts.Attributes;
public class clrModule
{
diff --git a/src/clrmodule/Properties/AssemblyInfo.cs b/src/clrmodule/Properties/AssemblyInfo.cs
index 939f4171f..5e2e05ed4 100644
--- a/src/clrmodule/Properties/AssemblyInfo.cs
+++ b/src/clrmodule/Properties/AssemblyInfo.cs
@@ -1,11 +1,5 @@
using System.Reflection;
using System.Runtime.InteropServices;
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("clrmodule")]
-[assembly: AssemblyDescription("")]
-
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("ae10d6a4-55c2-482f-9716-9988e6c169e3")]
diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj
deleted file mode 100644
index 7fc9c2dda..000000000
--- a/src/clrmodule/clrmodule.15.csproj
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
- net40
- x64;x86
- DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3
- clrmodule
- clrmodule
- clrmodule
- 2.5.0
- false
- false
- false
- false
- false
- false
- bin\clrmodule.xml
- bin\
- false
- 1591
- ..\..\
- $(SolutionDir)\bin\
- $(PythonBuildDir)\$(TargetFramework)\
- 6
- prompt
- $(PYTHONNET_DEFINE_CONSTANTS)
- XPLAT
- $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants);
- $(DefineConstants);TRACE;DEBUG
-
-
-
- x86
-
-
- x64
-
-
-
- false
- full
-
-
- true
- pdbonly
-
-
-
- $(DefineConstants);PYTHON2;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON2
-
-
- $(DefineConstants);PYTHON2;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON2
-
-
- $(DefineConstants);PYTHON3;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON3
-
-
- $(DefineConstants);PYTHON3;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON3
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
-
-
diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj
index 6e5ff4966..8595fd0ba 100644
--- a/src/clrmodule/clrmodule.csproj
+++ b/src/clrmodule/clrmodule.csproj
@@ -1,95 +1,24 @@
-
-
+
- Debug
- AnyCPU
- {86E834DE-1139-4511-96CC-69636A56E7AC}
- Library
- clrmodule
- clrmodule
- bin\clrmodule.xml
- bin\
- v4.0
-
- 1591
- ..\..\
- $(SolutionDir)\bin\
- Properties
- 6
- true
- prompt
+ net472
+ win-x86;win-x64
+ clr
-
+
+
+
+
+
+ 1.0.0
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
+
+
x86
-
+
x64
-
- true
- PYTHON2;TRACE;DEBUG
- full
-
-
- PYTHON2
- true
- pdbonly
-
-
- true
- PYTHON2;TRACE;DEBUG
- full
-
-
- PYTHON2
- true
- pdbonly
-
-
- true
- PYTHON3;TRACE;DEBUG
- full
-
-
- PYTHON3
- true
- pdbonly
-
-
- true
- PYTHON3;TRACE;DEBUG
- full
-
-
- PYTHON3
- true
- pdbonly
-
-
-
- ..\..\packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll
- False
-
-
-
-
-
-
- Properties\SharedAssemblyInfo.cs
-
-
-
-
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
diff --git a/src/clrmodule/packages.config b/src/clrmodule/packages.config
deleted file mode 100644
index 2a95dc54d..000000000
--- a/src/clrmodule/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj
deleted file mode 100644
index a5d8043f9..000000000
--- a/src/console/Console.15.csproj
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
- net40;netcoreapp3.1
- x64;x86
- DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3
- Exe
- nPython
- Python.Runtime
- nPython
- 2.5.0
- false
- false
- false
- false
- false
- false
- bin\
- false
- $(OutputPath)\$(AssemblyName).xml
- $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml
- 1591
- ..\..\
- $(SolutionDir)\bin\
- $(PythonBuildDir)\$(TargetFramework)\
- 6
- python-clear.ico
- prompt
- $(PYTHONNET_DEFINE_CONSTANTS)
- XPLAT
- $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants);
- $(DefineConstants);TRACE;DEBUG
- $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\
-
-
- x86
-
-
- x64
-
-
-
- false
- full
-
-
- true
- pdbonly
-
-
- true
- false
- full
-
-
- true
- true
- portable
-
-
-
- $(DefineConstants);DEBUG;TRACE
-
-
- $(DefineConstants)
-
-
-
- $(PythonManifest)
-
-
-
-
-
-
- Properties\SharedAssemblyInfo.cs
-
-
-
-
-
- Python.Runtime.dll
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/console/Console.csproj b/src/console/Console.csproj
index 226105f95..08854cfc9 100644
--- a/src/console/Console.csproj
+++ b/src/console/Console.csproj
@@ -1,101 +1,27 @@
-
-
+
- Debug
- AnyCPU
- {E29DCF0A-5114-4A98-B1DD-71264B6EA349}
+ net472;netcoreapp3.1
+ x64;x86
Exe
nPython
Python.Runtime
- bin\nPython.xml
- bin\
- v4.0
-
- 1591
- ..\..\
- $(SolutionDir)\bin\
- Properties
- 6
+ nPython
python-clear.ico
- prompt
-
- x86
-
-
- x64
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- $(PythonManifest)
-
-
-
-
-
-
-
- Properties\SharedAssemblyInfo.cs
-
-
-
+
-
+
Python.Runtime.dll
-
- {097b4ac0-74e9-4c58-bcf8-c69746ec8271}
- Python.Runtime
-
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
-
-
-
-
diff --git a/src/console/Properties/AssemblyInfo.cs b/src/console/Properties/AssemblyInfo.cs
deleted file mode 100644
index 081ae0c94..000000000
--- a/src/console/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using System.Reflection;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Python Console")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyDefaultAlias("python.exe")]
diff --git a/src/embed_tests/Program.cs b/src/embed_tests/Program.cs
deleted file mode 100644
index b4439e3e4..000000000
--- a/src/embed_tests/Program.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-using NUnit.Common;
-
-using NUnitLite;
-
-namespace Python.EmbeddingTest
-{
- public class Program
- {
- public static int Main(string[] args)
- {
- return new AutoRun(typeof(Program).Assembly).Execute(
- args,
- new ExtendedTextWrapper(Console.Out),
- Console.In);
- }
- }
-}
diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj
deleted file mode 100644
index 9d439cff4..000000000
--- a/src/embed_tests/Python.EmbeddingTest.15.csproj
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
- net40;netcoreapp3.1
- x64;x86
- DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3
- Exe
- false
- Python.EmbeddingTest
- Python.EmbeddingTest
- Python.EmbeddingTest
- 2.5.0
- false
- false
- false
- false
- bin\
- false
- $(OutputPath)\$(AssemblyName).xml
- $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml
- 1591
- ..\..\
- $(SolutionDir)\bin\
- $(OutputPath)\$(TargetFramework)_publish
- 7.3
- prompt
- $(PYTHONNET_DEFINE_CONSTANTS)
- XPLAT
- $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants);
- $(DefineConstants);NETCOREAPP
- $(DefineConstants);NETSTANDARD
- $(DefineConstants);TRACE;DEBUG
- $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\
-
-
- x86
-
-
- x64
-
-
-
- false
- full
-
-
- true
- pdbonly
-
-
- true
- false
- full
-
-
- true
- true
- portable
-
-
-
- $(DefineConstants);DEBUG;TRACE
-
-
- $(DefineConstants)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
-
-
diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj
index 264b3a5ed..8f2db8efe 100644
--- a/src/embed_tests/Python.EmbeddingTest.csproj
+++ b/src/embed_tests/Python.EmbeddingTest.csproj
@@ -1,143 +1,29 @@
-
-
+
+
- Debug
- AnyCPU
- {4165C59D-2822-499F-A6DB-EACA4C331EB5}
- Library
- Python.EmbeddingTest
- Python.EmbeddingTest
- bin\Python.EmbeddingTest.xml
- bin\
- v4.0
-
- 1591
- ..\..\
- $(SolutionDir)\bin\
- 7.3
- true
- prompt
+ net472;netcoreapp3.1
-
- x86
-
-
- x64
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
-
-
- ..\..\packages\NUnit.3.12.0\lib\net40\nunit.framework.dll
-
-
- ..\..\packages\System.ValueTuple.4.5.0\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll
-
-
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}
- Python.Runtime
-
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+ 1.0.0
+ all
+ runtime; build; native; contentfiles; analyzers
+
-
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
+
diff --git a/src/embed_tests/TestDomainReload.cs b/src/embed_tests/TestDomainReload.cs
index 4c9de1461..a606932f3 100644
--- a/src/embed_tests/TestDomainReload.cs
+++ b/src/embed_tests/TestDomainReload.cs
@@ -14,7 +14,7 @@
//
// Unfortunately this means no continuous integration testing for this case.
//
-#if !NETSTANDARD && !NETCOREAPP
+#if NETFRAMEWORK
namespace Python.EmbeddingTest
{
class TestDomainReload
@@ -400,7 +400,7 @@ public object Call(string methodName, params object[] args)
return method.Invoke(null, args);
}
}
-
+
static T CreateInstanceInstanceAndUnwrap(AppDomain domain)
{
Type type = typeof(T);
diff --git a/src/embed_tests/TestFinalizer.cs b/src/embed_tests/TestFinalizer.cs
index a54bc7a96..5ae0b302f 100644
--- a/src/embed_tests/TestFinalizer.cs
+++ b/src/embed_tests/TestFinalizer.cs
@@ -38,6 +38,7 @@ private static bool FullGCCollect()
catch (NotImplementedException)
{
// Some clr runtime didn't implement GC.WaitForFullGCComplete yet.
+ Thread.Sleep(300);
return false;
}
finally
@@ -47,6 +48,7 @@ private static bool FullGCCollect()
}
[Test]
+ [Ignore("Ignore temporarily")]
public void CollectBasicObject()
{
Assert.IsTrue(Finalizer.Instance.Enable);
diff --git a/src/embed_tests/TestPyWith.cs b/src/embed_tests/TestPyWith.cs
index 0c4e9023f..dcd539504 100644
--- a/src/embed_tests/TestPyWith.cs
+++ b/src/embed_tests/TestPyWith.cs
@@ -25,15 +25,14 @@ public void Dispose()
public void TestWithPositive()
{
var locals = new PyDict();
-
+
PythonEngine.Exec(@"
class CmTest:
def __enter__(self):
- print('Enter')
return self
def __exit__(self, t, v, tb):
# Exception not handled, return will be False
- print('Exit')
+ pass
def fail(self):
return 5 / 0
@@ -51,6 +50,7 @@ def fail(self):
}
catch (PythonException e)
{
+ TestContext.Out.WriteLine(e.Message);
Assert.IsTrue(e.Message.Contains("ZeroDivisionError"));
}
}
diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs
index ebb4fabd0..24f31acff 100644
--- a/src/embed_tests/pyimport.cs
+++ b/src/embed_tests/pyimport.cs
@@ -30,12 +30,8 @@ public void SetUp()
/* Append the tests directory to sys.path
* using reflection to circumvent the private
* modifiers placed on most Runtime methods. */
-#if NETCOREAPP
- const string s = "../../fixtures";
-#else
- const string s = "../fixtures";
-#endif
- string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s);
+ string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, "fixtures");
+ TestContext.Out.WriteLine(testPath);
IntPtr str = Runtime.Runtime.PyString_FromString(testPath);
BorrowedReference path = Runtime.Runtime.PySys_GetObject("path");
diff --git a/src/monoclr/clrmod.c b/src/monoclr/clrmod.c
index 4e8027e3a..cdfd89342 100644
--- a/src/monoclr/clrmod.c
+++ b/src/monoclr/clrmod.c
@@ -1,70 +1,215 @@
-#include "pynetclr.h"
+// #define Py_LIMITED_API 0x03050000
+#include
-/* List of functions defined in the module */
-static PyMethodDef clr_methods[] = {
- {NULL, NULL, 0, NULL} /* Sentinel */
-};
+#include "stdlib.h"
-PyDoc_STRVAR(clr_module_doc,
- "clr facade module to initialize the CLR. It's later "
- "replaced by the real clr module. This module has a facade "
- "attribute to make it distinguishable from the real clr module."
-);
+#define MONO_VERSION "v4.0.30319.1"
+#define MONO_DOMAIN "Python"
-static PyNet_Args *pn_args;
-char **environ = NULL;
-
-#if PY_MAJOR_VERSION >= 3
-static struct PyModuleDef clrdef = {
- PyModuleDef_HEAD_INIT,
- "clr", /* m_name */
- clr_module_doc, /* m_doc */
- -1, /* m_size */
- clr_methods, /* m_methods */
- NULL, /* m_reload */
- NULL, /* m_traverse */
- NULL, /* m_clear */
- NULL, /* m_free */
-};
+#include
+#include
+#include
+#include
+#include
+
+#ifndef _WIN32
+#include "dirent.h"
+#include "dlfcn.h"
+#include "libgen.h"
+#include "alloca.h"
#endif
-static PyObject *_initclr()
+typedef struct
{
- PyObject *m;
+ MonoDomain *domain;
+ MonoAssembly *pr_assm;
+ MonoMethod *shutdown;
+ const char *pr_file;
+ char *error;
+ char *init_name;
+ char *shutdown_name;
+ PyObject *module;
+} PyNet_Args;
- /* Create the module and add the functions */
-#if PY_MAJOR_VERSION >= 3
- m = PyModule_Create(&clrdef);
-#else
- m = Py_InitModule3("clr", clr_methods, clr_module_doc);
-#endif
- if (m == NULL)
- return NULL;
- PyModule_AddObject(m, "facade", Py_True);
- Py_INCREF(Py_True);
+PyNet_Args *PyNet_Init(void);
+static PyNet_Args *pn_args;
- pn_args = PyNet_Init(1);
+PyMODINIT_FUNC
+PyInit_clr(void)
+{
+ pn_args = PyNet_Init();
if (pn_args->error)
{
return NULL;
}
- if (NULL != pn_args->module)
- return pn_args->module;
+ return pn_args->module;
+}
+
+void PyNet_Finalize(PyNet_Args *);
+void main_thread_handler(PyNet_Args *user_data);
+
+// initialize Mono and PythonNet
+PyNet_Args *PyNet_Init()
+{
+ PyObject *pn_module;
+ PyObject *pn_path;
+ PyNet_Args *pn_args;
+ pn_args = (PyNet_Args *)malloc(sizeof(PyNet_Args));
+
+ pn_module = PyImport_ImportModule("pythonnet");
+ if (pn_module == NULL)
+ {
+ pn_args->error = "Failed to import pythonnet";
+ return pn_args;
+ }
+
+ pn_path = PyObject_CallMethod(pn_module, "get_assembly_path", NULL);
+ if (pn_path == NULL)
+ {
+ Py_DecRef(pn_module);
+ pn_args->error = "Failed to get assembly path";
+ return pn_args;
+ }
+
+ pn_args->pr_file = PyUnicode_AsUTF8(pn_path);
+ pn_args->error = NULL;
+ pn_args->shutdown = NULL;
+ pn_args->module = NULL;
+
+#ifdef __linux__
+ // Force preload libmono-2.0 as global. Without this, on some systems
+ // symbols from libmono are not found by libmononative (which implements
+ // some of the System.* namespaces). Since the only happened on Linux so
+ // far, we hardcode the library name, load the symbols into the global
+ // namespace and leak the handle.
+ dlopen("libmono-2.0.so", RTLD_LAZY | RTLD_GLOBAL);
+#endif
+
+ pn_args->init_name = "Python.Runtime:InitExt()";
+ pn_args->shutdown_name = "Python.Runtime:Shutdown()";
+
+ pn_args->domain = mono_jit_init_version(MONO_DOMAIN, MONO_VERSION);
+
+ // XXX: Skip setting config for now, should be derived from pr_file
+ // mono_domain_set_config(pn_args->domain, ".", "Python.Runtime.dll.config");
+
+ /*
+ * Load the default Mono configuration file, this is needed
+ * if you are planning on using the dllmaps defined on the
+ * system configuration
+ */
+ mono_config_parse(NULL);
+
+ main_thread_handler(pn_args);
- return m;
+ if (pn_args->error != NULL)
+ {
+ PyErr_SetString(PyExc_ImportError, pn_args->error);
+ }
+ return pn_args;
}
-#if PY_MAJOR_VERSION >= 3
-PyMODINIT_FUNC
-PyInit_clr(void)
+char *PyNet_ExceptionToString(MonoObject *e);
+
+// Shuts down PythonNet and cleans up Mono
+void PyNet_Finalize(PyNet_Args *pn_args)
+{
+ MonoObject *exception = NULL;
+
+ if (pn_args->shutdown)
+ {
+ mono_runtime_invoke(pn_args->shutdown, NULL, NULL, &exception);
+ if (exception)
+ {
+ pn_args->error = PyNet_ExceptionToString(exception);
+ }
+ pn_args->shutdown = NULL;
+ }
+
+ if (pn_args->domain)
+ {
+ mono_jit_cleanup(pn_args->domain);
+ pn_args->domain = NULL;
+ }
+ free(pn_args);
+}
+
+MonoMethod *getMethodFromClass(MonoClass *cls, char *name)
{
- return _initclr();
+ MonoMethodDesc *mdesc;
+ MonoMethod *method;
+
+ mdesc = mono_method_desc_new(name, 1);
+ method = mono_method_desc_search_in_class(mdesc, cls);
+ mono_method_desc_free(mdesc);
+
+ return method;
}
-#else
-PyMODINIT_FUNC
-initclr(void)
+
+void main_thread_handler(PyNet_Args *user_data)
+{
+ PyNet_Args *pn_args = user_data;
+ MonoMethod *init;
+ MonoImage *pr_image;
+ MonoClass *pythonengine;
+ MonoObject *exception = NULL;
+ MonoObject *init_result;
+
+ pn_args->pr_assm = mono_domain_assembly_open(pn_args->domain, pn_args->pr_file);
+ if (!pn_args->pr_assm)
+ {
+ pn_args->error = "Unable to load assembly";
+ return;
+ }
+
+ pr_image = mono_assembly_get_image(pn_args->pr_assm);
+ if (!pr_image)
+ {
+ pn_args->error = "Unable to get image";
+ return;
+ }
+
+ pythonengine = mono_class_from_name(pr_image, "Python.Runtime", "PythonEngine");
+ if (!pythonengine)
+ {
+ pn_args->error = "Unable to load class PythonEngine from Python.Runtime";
+ return;
+ }
+
+ init = getMethodFromClass(pythonengine, pn_args->init_name);
+ if (!init)
+ {
+ pn_args->error = "Unable to fetch Init method from PythonEngine";
+ return;
+ }
+
+ pn_args->shutdown = getMethodFromClass(pythonengine, pn_args->shutdown_name);
+ if (!pn_args->shutdown)
+ {
+ pn_args->error = "Unable to fetch shutdown method from PythonEngine";
+ return;
+ }
+
+ init_result = mono_runtime_invoke(init, NULL, NULL, &exception);
+ if (exception)
+ {
+ pn_args->error = PyNet_ExceptionToString(exception);
+ return;
+ }
+
+ pn_args->module = *(PyObject**)mono_object_unbox(init_result);
+}
+
+// Get string from a Mono exception
+char *PyNet_ExceptionToString(MonoObject *e)
{
- _initclr();
+ MonoMethodDesc *mdesc = mono_method_desc_new(":ToString()", 0 /*FALSE*/);
+ MonoMethod *mmethod = mono_method_desc_search_in_class(mdesc, mono_get_object_class());
+ mono_method_desc_free(mdesc);
+
+ mmethod = mono_object_get_virtual_method(e, mmethod);
+ MonoString *monoString = (MonoString*) mono_runtime_invoke(mmethod, e, NULL, NULL);
+ mono_runtime_invoke(mmethod, e, NULL, NULL);
+ return mono_string_to_utf8(monoString);
}
-#endif
diff --git a/src/monoclr/pynetclr.h b/src/monoclr/pynetclr.h
deleted file mode 100644
index 1863b1d43..000000000
--- a/src/monoclr/pynetclr.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef PYNET_CLR_H
-#define PYNET_CLR_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#define MONO_VERSION "v4.0.30319.1"
-#define MONO_DOMAIN "Python.Runtime"
-#define PR_ASSEMBLY "Python.Runtime.dll"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct
-{
- MonoDomain *domain;
- MonoAssembly *pr_assm;
- MonoMethod *shutdown;
- char *pr_file;
- char *error;
- char *init_name;
- char *shutdown_name;
- PyObject *module;
-} PyNet_Args;
-
-PyNet_Args *PyNet_Init(int);
-void PyNet_Finalize(PyNet_Args *);
-void main_thread_handler(PyNet_Args *user_data);
-char *PyNet_ExceptionToString(MonoObject *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // PYNET_CLR_H
diff --git a/src/monoclr/pynetinit.c b/src/monoclr/pynetinit.c
deleted file mode 100644
index 149d52296..000000000
--- a/src/monoclr/pynetinit.c
+++ /dev/null
@@ -1,261 +0,0 @@
-#include "pynetclr.h"
-#include "stdlib.h"
-
-#ifndef _WIN32
-#include "dirent.h"
-#include "dlfcn.h"
-#include "libgen.h"
-#include "alloca.h"
-#endif
-
-
-// initialize Mono and PythonNet
-PyNet_Args *PyNet_Init(int ext)
-{
- PyNet_Args *pn_args;
- pn_args = (PyNet_Args *)malloc(sizeof(PyNet_Args));
- pn_args->pr_file = PR_ASSEMBLY;
- pn_args->error = NULL;
- pn_args->shutdown = NULL;
- pn_args->module = NULL;
-
-#ifdef __linux__
- // Force preload libmono-2.0 as global. Without this, on some systems
- // symbols from libmono are not found by libmononative (which implements
- // some of the System.* namespaces). Since the only happened on Linux so
- // far, we hardcode the library name, load the symbols into the global
- // namespace and leak the handle.
- dlopen("libmono-2.0.so", RTLD_LAZY | RTLD_GLOBAL);
-#endif
-
- if (ext == 0)
- {
- pn_args->init_name = "Python.Runtime:Initialize()";
- }
- else
- {
- pn_args->init_name = "Python.Runtime:InitExt()";
- }
- pn_args->shutdown_name = "Python.Runtime:Shutdown()";
-
- pn_args->domain = mono_jit_init_version(MONO_DOMAIN, MONO_VERSION);
- mono_domain_set_config(pn_args->domain, ".", "Python.Runtime.dll.config");
-
- /*
- * Load the default Mono configuration file, this is needed
- * if you are planning on using the dllmaps defined on the
- * system configuration
- */
- mono_config_parse(NULL);
-
- /* I can't use this call to run the main_thread_handler. The function
- * runs it in another thread but *this* thread holds the Python
- * import lock -> DEAD LOCK.
- *
- * mono_runtime_exec_managed_code(pn_args->domain, main_thread_handler,
- * pn_args);
- */
-
- main_thread_handler(pn_args);
-
- if (pn_args->error != NULL)
- {
- PyErr_SetString(PyExc_ImportError, pn_args->error);
- }
- return pn_args;
-}
-
-// Shuts down PythonNet and cleans up Mono
-void PyNet_Finalize(PyNet_Args *pn_args)
-{
- MonoObject *exception = NULL;
-
- if (pn_args->shutdown)
- {
- mono_runtime_invoke(pn_args->shutdown, NULL, NULL, &exception);
- if (exception)
- {
- pn_args->error = PyNet_ExceptionToString(exception);
- }
- pn_args->shutdown = NULL;
- }
-
- if (pn_args->domain)
- {
- mono_jit_cleanup(pn_args->domain);
- pn_args->domain = NULL;
- }
- free(pn_args);
-}
-
-MonoMethod *getMethodFromClass(MonoClass *cls, char *name)
-{
- MonoMethodDesc *mdesc;
- MonoMethod *method;
-
- mdesc = mono_method_desc_new(name, 1);
- method = mono_method_desc_search_in_class(mdesc, cls);
- mono_method_desc_free(mdesc);
-
- return method;
-}
-
-void main_thread_handler(PyNet_Args *user_data)
-{
- PyNet_Args *pn_args = user_data;
- MonoMethod *init;
- MonoImage *pr_image;
- MonoClass *pythonengine;
- MonoObject *exception = NULL;
- MonoObject *init_result;
-
-#ifndef _WIN32
- // Get the filename of the python shared object and set
- // LD_LIBRARY_PATH so Mono can find it.
- Dl_info dlinfo = {0};
- if (0 != dladdr(&Py_Initialize, &dlinfo))
- {
- char *fname = alloca(strlen(dlinfo.dli_fname) + 1);
- strcpy(fname, dlinfo.dli_fname);
- char *py_libdir = dirname(fname);
- char *ld_library_path = getenv("LD_LIBRARY_PATH");
- if (NULL == ld_library_path)
- {
- setenv("LD_LIBRARY_PATH", py_libdir, 1);
- }
- else
- {
- char *new_ld_library_path = alloca(strlen(py_libdir)
- + strlen(ld_library_path)
- + 2);
- strcpy(new_ld_library_path, py_libdir);
- strcat(new_ld_library_path, ":");
- strcat(new_ld_library_path, ld_library_path);
- setenv("LD_LIBRARY_PATH", new_ld_library_path, 1);
- }
- }
-
- //get python path system variable
- PyObject *syspath = PySys_GetObject("path");
- char *runtime_full_path = (char*) malloc(1024);
- const char *slash = "/";
- int found = 0;
-
- int ii = 0;
- for (ii = 0; ii < PyList_Size(syspath); ++ii)
- {
-#if PY_MAJOR_VERSION >= 3
- Py_ssize_t wlen;
- wchar_t *wstr = PyUnicode_AsWideCharString(PyList_GetItem(syspath, ii), &wlen);
- char *pydir = (char*)malloc(wlen + 1);
- size_t mblen = wcstombs(pydir, wstr, wlen + 1);
- if (mblen > wlen)
- pydir[wlen] = '\0';
- PyMem_Free(wstr);
-#else
- const char *pydir = PyString_AsString(PyList_GetItem(syspath, ii));
-#endif
- char *curdir = (char*) malloc(1024);
- strncpy(curdir, strlen(pydir) > 0 ? pydir : ".", 1024);
- strncat(curdir, slash, 1024);
-
-#if PY_MAJOR_VERSION >= 3
- free(pydir);
-#endif
-
- //look in this directory for the pn_args->pr_file
- DIR *dirp = opendir(curdir);
- if (dirp != NULL)
- {
- struct dirent *dp;
- while ((dp = readdir(dirp)) != NULL)
- {
- if (strcmp(dp->d_name, pn_args->pr_file) == 0)
- {
- strcpy(runtime_full_path, curdir);
- strcat(runtime_full_path, pn_args->pr_file);
- found = 1;
- break;
- }
- }
- closedir(dirp);
- }
- free(curdir);
-
- if (found)
- {
- pn_args->pr_file = runtime_full_path;
- break;
- }
- }
-
- if (!found)
- {
- fprintf(stderr, "Could not find assembly %s. \n", pn_args->pr_file);
- return;
- }
-#endif
-
- pn_args->pr_assm = mono_domain_assembly_open(pn_args->domain, pn_args->pr_file);
- if (!pn_args->pr_assm)
- {
- pn_args->error = "Unable to load assembly";
- return;
- }
-#ifndef _WIN32
- free(runtime_full_path);
-#endif
-
- pr_image = mono_assembly_get_image(pn_args->pr_assm);
- if (!pr_image)
- {
- pn_args->error = "Unable to get image";
- return;
- }
-
- pythonengine = mono_class_from_name(pr_image, "Python.Runtime", "PythonEngine");
- if (!pythonengine)
- {
- pn_args->error = "Unable to load class PythonEngine from Python.Runtime";
- return;
- }
-
- init = getMethodFromClass(pythonengine, pn_args->init_name);
- if (!init)
- {
- pn_args->error = "Unable to fetch Init method from PythonEngine";
- return;
- }
-
- pn_args->shutdown = getMethodFromClass(pythonengine, pn_args->shutdown_name);
- if (!pn_args->shutdown)
- {
- pn_args->error = "Unable to fetch shutdown method from PythonEngine";
- return;
- }
-
- init_result = mono_runtime_invoke(init, NULL, NULL, &exception);
- if (exception)
- {
- pn_args->error = PyNet_ExceptionToString(exception);
- return;
- }
-
-#if PY_MAJOR_VERSION >= 3
- if (NULL != init_result)
- pn_args->module = *(PyObject**)mono_object_unbox(init_result);
-#endif
-}
-
-// Get string from a Mono exception
-char *PyNet_ExceptionToString(MonoObject *e)
-{
- MonoMethodDesc *mdesc = mono_method_desc_new(":ToString()", 0 /*FALSE*/);
- MonoMethod *mmethod = mono_method_desc_search_in_class(mdesc, mono_get_object_class());
- mono_method_desc_free(mdesc);
-
- mmethod = mono_object_get_virtual_method(e, mmethod);
- MonoString *monoString = (MonoString*) mono_runtime_invoke(mmethod, e, NULL, NULL);
- mono_runtime_invoke(mmethod, e, NULL, NULL);
- return mono_string_to_utf8(monoString);
-}
diff --git a/src/perf_tests/Python.PerformanceTests.csproj b/src/perf_tests/Python.PerformanceTests.csproj
index f84e556aa..22783e595 100644
--- a/src/perf_tests/Python.PerformanceTests.csproj
+++ b/src/perf_tests/Python.PerformanceTests.csproj
@@ -1,12 +1,8 @@
- net461
- DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3
- bin\
-
+ net472
false
-
x64;x86
@@ -28,7 +24,7 @@
-
+
diff --git a/src/runtime/Properties/AssemblyInfo.cs b/src/runtime/Properties/AssemblyInfo.cs
index cab9df30b..470488c02 100644
--- a/src/runtime/Properties/AssemblyInfo.cs
+++ b/src/runtime/Properties/AssemblyInfo.cs
@@ -1,11 +1,3 @@
-using System.Reflection;
using System.Runtime.CompilerServices;
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Python.NET")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyDefaultAlias("Python.Runtime.dll")]
-
[assembly: InternalsVisibleTo("Python.EmbeddingTest")]
diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj
deleted file mode 100644
index d530fd5e4..000000000
--- a/src/runtime/Python.Runtime.15.csproj
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
- net40;netstandard2.0
- AnyCPU
- DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3
- net45
- Python.Runtime
- Python.Runtime
- pythonnet
- 2.5.0
- true
- false
- Python.NET
- Copyright (c) 2006-2020 the contributors of the Python.NET project
- Python and CLR (.NET and Mono) cross-platform language interop
- pythonnet
- https://github.com/pythonnet/pythonnet/blob/master/LICENSE
- https://github.com/pythonnet/pythonnet
- git
-
- true
- true
- true
- snupkg
-
- python interop dynamic dlr Mono pinvoke
- https://raw.githubusercontent.com/pythonnet/pythonnet/master/src/console/python-clear.ico
- https://pythonnet.github.io/
- bin\
- false
- $(OutputPath)\$(AssemblyName).xml
- $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml
- 1591;NU1701
- ..\..\
- $(SolutionDir)\bin\
- $(PythonBuildDir)\$(TargetFramework)\
- 7.3
- True
- ..\pythonnet.snk
- $(PYTHONNET_DEFINE_CONSTANTS)
- XPLAT
- $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants);
- $(DefineConstants);NETSTANDARD
- $(DefineConstants);TRACE;DEBUG
- $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\
- $(PYTHONNET_PY2_VERSION)
- PYTHON27
- $(PYTHONNET_PY3_VERSION)
- PYTHON38
- $(PYTHONNET_WIN_DEFINE_CONSTANTS)
- $(PYTHONNET_MONO_DEFINE_CONSTANTS)
- MONO_LINUX;PYTHON_WITH_PYMALLOC
- $(PYTHONNET_INTEROP_FILE)
-
-
- false
- full
-
-
- true
- pdbonly
-
-
- true
- false
- full
-
-
- true
- true
- portable
-
-
-
- $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants)
-
-
- $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants)
-
-
- $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);FINALIZER_CHECK;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);FINALIZER_CHECK;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants)
-
-
- $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants)
-
-
- $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);FINALIZER_CHECK;TRACE;DEBUG
-
-
- $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);FINALIZER_CHECK;TRACE;DEBUG
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- clr.py
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
- TextTemplatingFileGenerator
- intern_.cs
-
-
-
-
-
-
- True
- True
- intern_.tt
-
-
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj
index 8d56774c9..acb8efc4e 100644
--- a/src/runtime/Python.Runtime.csproj
+++ b/src/runtime/Python.Runtime.csproj
@@ -1,195 +1,39 @@
-
-
-
- Debug
- AnyCPU
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}
- Library
- Python.Runtime
- Python.Runtime
- bin\Python.Runtime.xml
- bin\
- v4.0
-
- 1591
- ..\..\
- $(SolutionDir)\bin\
- Properties
- 7.3
- true
- false
- ..\pythonnet.snk
-
-
-
-
-
- PYTHON2;PYTHON27
- true
- pdbonly
-
-
- PYTHON3;PYTHON38
- true
- pdbonly
-
-
- true
- PYTHON2;PYTHON27;TRACE;DEBUG
- false
- full
-
-
- true
- PYTHON3;PYTHON38;TRACE;DEBUG
- false
- full
-
-
- PYTHON2;PYTHON27
- true
- pdbonly
-
-
- PYTHON3;PYTHON38
- true
- pdbonly
-
-
- true
- PYTHON2;PYTHON27;TRACE;DEBUG
- false
- full
-
-
- true
- PYTHON3;PYTHON38;TRACE;DEBUG
- false
- full
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Properties\SharedAssemblyInfo.cs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- clr.py
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
+
+
+ netstandard2.0
+ AnyCPU
+ Python.Runtime
+ Python.Runtime
+ pythonnet
+ https://github.com/pythonnet/pythonnet/blob/master/LICENSE
+ https://github.com/pythonnet/pythonnet
+ git
+ python interop dynamic dlr Mono pinvoke
+ https://raw.githubusercontent.com/pythonnet/pythonnet/master/src/console/python-clear.ico
+ https://pythonnet.github.io/
+ 1591;NU1701
+ True
+
+
+
+ $(DefineConstants);$(ConfiguredConstants)
+
+
+
+
+
+
+
+
+
+
+
+ clr.py
+
+
+
+
+
+
+
+
diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs
index ec0bf338c..e33eb1c81 100644
--- a/src/runtime/nativecall.cs
+++ b/src/runtime/nativecall.cs
@@ -12,14 +12,6 @@ namespace Python.Runtime
/// C API can just be wrapped with p/invoke, but there are some
/// situations (specifically, calling functions through Python
/// type structures) where we need to call functions indirectly.
- /// This class uses Reflection.Emit to generate IJW thunks that
- /// support indirect calls to native code using various common
- /// call signatures. This is mainly a workaround for the fact
- /// that you can't spell an indirect call in C# (but can in IL).
- /// Another approach that would work is for this to be turned
- /// into a separate utility program that could be run during the
- /// build process to generate the thunks as a separate assembly
- /// that could then be referenced by the main Python runtime.
///
internal class NativeCall
{
diff --git a/src/runtime/polyfill/ReflectionPolifills.cs b/src/runtime/polyfill/ReflectionPolyfills.cs
similarity index 89%
rename from src/runtime/polyfill/ReflectionPolifills.cs
rename to src/runtime/polyfill/ReflectionPolyfills.cs
index b8bc7ea3e..65f9b83de 100644
--- a/src/runtime/polyfill/ReflectionPolifills.cs
+++ b/src/runtime/polyfill/ReflectionPolyfills.cs
@@ -5,10 +5,8 @@
namespace Python.Runtime
{
- [Obsolete("This API is for internal use only")]
- public static class ReflectionPolifills
+ internal static class ReflectionPolyfills
{
-#if NETSTANDARD
public static AssemblyBuilder DefineDynamicAssembly(this AppDomain appDomain, AssemblyName assemblyName, AssemblyBuilderAccess assemblyBuilderAccess)
{
return AssemblyBuilder.DefineDynamicAssembly(assemblyName, assemblyBuilderAccess);
@@ -18,7 +16,7 @@ public static Type CreateType(this TypeBuilder typeBuilder)
{
return typeBuilder.CreateTypeInfo();
}
-#endif
+
public static T GetCustomAttribute(this Type type) where T: Attribute
{
return type.GetCustomAttributes(typeof(T), inherit: false)
diff --git a/src/runtime/pyint.cs b/src/runtime/pyint.cs
index e49e62a8a..f8718cb95 100644
--- a/src/runtime/pyint.cs
+++ b/src/runtime/pyint.cs
@@ -69,7 +69,6 @@ public PyInt(int value) : base(FromInt(value))
///
/// Creates a new Python int from a uint32 value.
///
- [CLSCompliant(false)]
public PyInt(uint value) : base(FromLong(value))
{
}
@@ -99,7 +98,6 @@ private static IntPtr FromLong(long value)
///
/// Creates a new Python int from a uint64 value.
///
- [CLSCompliant(false)]
public PyInt(ulong value) : base(FromLong((long)value))
{
}
@@ -122,7 +120,6 @@ public PyInt(short value) : this((int)value)
///
/// Creates a new Python int from a uint16 value.
///
- [CLSCompliant(false)]
public PyInt(ushort value) : this((int)value)
{
}
@@ -145,7 +142,6 @@ public PyInt(byte value) : this((int)value)
///
/// Creates a new Python int from an sbyte value.
///
- [CLSCompliant(false)]
public PyInt(sbyte value) : this((int)value)
{
}
diff --git a/src/runtime/pylong.cs b/src/runtime/pylong.cs
index 87cc7d2a5..2f85824de 100644
--- a/src/runtime/pylong.cs
+++ b/src/runtime/pylong.cs
@@ -69,7 +69,6 @@ public PyLong(int value) : base(FromInt(value))
///
/// Creates a new PyLong from a uint32 value.
///
- [CLSCompliant(false)]
public PyLong(uint value) : base(FromInt((int)value))
{
}
@@ -105,7 +104,6 @@ private static IntPtr FromULong(ulong value)
///
/// Creates a new PyLong from a uint64 value.
///
- [CLSCompliant(false)]
public PyLong(ulong value) : base(FromULong(value))
{
}
@@ -128,7 +126,6 @@ public PyLong(short value) : base(FromInt((int)value))
///
/// Creates a new PyLong from an uint16 value.
///
- [CLSCompliant(false)]
public PyLong(ushort value) : base(FromInt((int)value))
{
}
@@ -151,7 +148,6 @@ public PyLong(byte value) : base(FromInt((int)value))
///
/// Creates a new PyLong from an sbyte value.
///
- [CLSCompliant(false)]
public PyLong(sbyte value) : base(FromInt((int)value))
{
}
diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs
index 8b6526b4f..43c63f346 100644
--- a/src/runtime/runtime.cs
+++ b/src/runtime/runtime.cs
@@ -706,7 +706,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects)
///
internal static unsafe void XIncref(IntPtr op)
{
-#if PYTHON_WITH_PYDEBUG || NETSTANDARD
+#if !CUSTOM_INCDEC_REF
Py_IncRef(op);
return;
#else
@@ -736,7 +736,7 @@ internal static IntPtr SelfIncRef(IntPtr op)
internal static unsafe void XDecref(IntPtr op)
{
-#if PYTHON_WITH_PYDEBUG || NETSTANDARD
+#if !CUSTOM_INCDEC_REF
Py_DecRef(op);
return;
#else
diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj
deleted file mode 100644
index 0e19adf91..000000000
--- a/src/testing/Python.Test.15.csproj
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
- net40;netstandard2.0
- x64;x86
- DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3
- Python.Test
- Python.Test
- Python.Test
- 2.5.0
- bin\
- false
- $(OutputPath)\$(AssemblyName).xml
- $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml
- 1591,0067
- ..\..\
- $(SolutionDir)\bin\
- $(PythonBuildDir)\$(TargetFramework)\
- 6
- false
- ..\pythonnet.snk
- prompt
- $(PYTHONNET_DEFINE_CONSTANTS)
- XPLAT
- $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants);
- $(DefineConstants);TRACE;DEBUG
- $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\
-
-
- x86
-
-
- x64
-
-
-
- false
- full
-
-
- true
- pdbonly
-
-
- true
- false
- full
-
-
- true
- true
- portable
-
-
-
- $(DefineConstants);DEBUG;TRACE
-
-
- $(DefineConstants)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
-
-
-
-
-
-
diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj
index e1a5ab85c..e0c0ca8b1 100644
--- a/src/testing/Python.Test.csproj
+++ b/src/testing/Python.Test.csproj
@@ -1,117 +1,13 @@
-
-
+
- Debug
- AnyCPU
- {6F401A34-273B-450F-9A4C-13550BE0767B}
- Library
- Python.Test
- Python.Test
- bin\Python.Test.xml
- bin\
- v4.0
-
- 1591,0067
- ..\..\
- $(SolutionDir)\bin\
- 6
- false
- ..\pythonnet.snk
- prompt
+ netstandard2.0
-
- x86
-
-
- x64
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
- true
- DEBUG;TRACE
- full
-
-
-
-
- true
- pdbonly
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-
- {097B4AC0-74E9-4C58-BCF8-C69746EC8271}
- Python.Runtime
-
-
-
-
- $(TargetPath)
- $(TargetDir)$(TargetName).pdb
-
+
-
-
+
diff --git a/src/tests/conftest.py b/src/tests/conftest.py
index a93326c51..17085e3ef 100644
--- a/src/tests/conftest.py
+++ b/src/tests/conftest.py
@@ -10,13 +10,21 @@
import sysconfig
import pytest
-import clr
# Add path for `Python.Test`
cwd = os.path.dirname(__file__)
fixtures_path = os.path.join(cwd, "fixtures")
+
+BUILD_TEST = True
+if BUILD_TEST:
+ from subprocess import check_call
+ test_proj_path = os.path.join(cwd, "..", "testing")
+ check_call(["dotnet", "build", test_proj_path, "-o", fixtures_path])
+
sys.path.append(fixtures_path)
+import clr
+
# Add References for tests
clr.AddReference("Python.Test")
clr.AddReference("System.Collections")
diff --git a/tools/nuget/nuget.exe b/tools/nuget/nuget.exe
deleted file mode 100644
index 463f8e137..000000000
Binary files a/tools/nuget/nuget.exe and /dev/null differ
diff --git a/tools/vswhere/vswhere.exe b/tools/vswhere/vswhere.exe
deleted file mode 100644
index 582e82868..000000000
Binary files a/tools/vswhere/vswhere.exe and /dev/null differ