diff --git a/BSIPA-Meta/BSIPA-Meta.csproj b/BSIPA-Meta/BSIPA-Meta.csproj
index 7d1e6a09..b355d8a4 100644
--- a/BSIPA-Meta/BSIPA-Meta.csproj
+++ b/BSIPA-Meta/BSIPA-Meta.csproj
@@ -20,10 +20,10 @@
x64
- 4
+ Net4
- 3
+ Net3
AnyCPU
@@ -85,7 +85,7 @@
-
+
diff --git a/BSIPA.sln b/BSIPA.sln
index 1e283126..d0fc87fe 100644
--- a/BSIPA.sln
+++ b/BSIPA.sln
@@ -49,138 +49,288 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BSIPA-Meta", "BSIPA-Meta\BS
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7} = {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}
EndProjectSection
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net3-Proxy", "Net3-Proxy\Net3-Proxy.csproj", "{642F52DA-90F9-40E3-8784-6964F36752FB}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64-Net3 = Debug|x64-Net3
Debug|x64-Net4 = Debug|x64-Net4
+ Debug|x86-Net3 = Debug|x86-Net3
Debug|x86-Net4 = Debug|x86-Net4
+ Release|x64-Net3 = Release|x64-Net3
Release|x64-Net4 = Release|x64-Net4
+ Release|x86-Net3 = Release|x86-Net3
Release|x86-Net4 = Release|x86-Net4
- Verbose|x64-Net4 = Verbose|x64-Net4
- Verbose|x86-Net4 = Verbose|x86-Net4
+ Verbose_Release|x64-Net3 = Verbose_Release|x64-Net3
Verbose_Release|x64-Net4 = Verbose_Release|x64-Net4
+ Verbose_Release|x86-Net3 = Verbose_Release|x86-Net3
Verbose_Release|x86-Net4 = Verbose_Release|x86-Net4
+ Verbose|x64-Net3 = Verbose|x64-Net3
+ Verbose|x64-Net4 = Verbose|x64-Net4
+ Verbose|x86-Net3 = Verbose|x86-Net3
+ Verbose|x86-Net4 = Verbose|x86-Net4
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x64-Net3.ActiveCfg = Debug|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x64-Net3.Build.0 = Debug|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x64-Net4.ActiveCfg = Debug|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x64-Net4.Build.0 = Debug|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x86-Net3.ActiveCfg = Debug|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x86-Net3.Build.0 = Debug|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x86-Net4.ActiveCfg = Debug|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Debug|x86-Net4.Build.0 = Debug|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x64-Net3.ActiveCfg = Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x64-Net3.Build.0 = Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x64-Net4.ActiveCfg = Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x64-Net4.Build.0 = Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x86-Net3.ActiveCfg = Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x86-Net3.Build.0 = Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x86-Net4.ActiveCfg = Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Release|x86-Net4.Build.0 = Release|Any CPU
- {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64-Net4.ActiveCfg = Verbose|Any CPU
- {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64-Net4.Build.0 = Verbose|Any CPU
- {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86-Net4.ActiveCfg = Verbose|Any CPU
- {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86-Net4.Build.0 = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x64-Net3.ActiveCfg = Verbose_Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x64-Net3.Build.0 = Verbose_Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x64-Net4.ActiveCfg = Verbose_Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x64-Net4.Build.0 = Verbose_Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x86-Net3.ActiveCfg = Verbose_Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x86-Net3.Build.0 = Verbose_Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x86-Net4.ActiveCfg = Verbose_Release|Any CPU
{14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose_Release|x86-Net4.Build.0 = Verbose_Release|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64-Net3.ActiveCfg = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64-Net3.Build.0 = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64-Net4.ActiveCfg = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x64-Net4.Build.0 = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86-Net3.ActiveCfg = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86-Net3.Build.0 = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86-Net4.ActiveCfg = Verbose|Any CPU
+ {14092533-98BB-40A4-9AFC-27BB75672A70}.Verbose|x86-Net4.Build.0 = Verbose|Any CPU
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x64-Net3.ActiveCfg = Debug|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x64-Net3.Build.0 = Debug|Net3
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x64-Net4.ActiveCfg = Debug|Net4
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x64-Net4.Build.0 = Debug|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x86-Net3.ActiveCfg = Debug|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x86-Net3.Build.0 = Debug|Net3
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x86-Net4.ActiveCfg = Debug|Net4
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Debug|x86-Net4.Build.0 = Debug|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x64-Net3.ActiveCfg = Release|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x64-Net3.Build.0 = Release|Net3
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x64-Net4.ActiveCfg = Release|Net4
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x64-Net4.Build.0 = Release|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x86-Net3.ActiveCfg = Release|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x86-Net3.Build.0 = Release|Net3
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x86-Net4.ActiveCfg = Release|Net4
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Release|x86-Net4.Build.0 = Release|Net4
- {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64-Net4.ActiveCfg = Debug|Net4
- {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64-Net4.Build.0 = Debug|Net4
- {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86-Net4.ActiveCfg = Debug|Net4
- {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86-Net4.Build.0 = Debug|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x64-Net3.ActiveCfg = Release|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x64-Net3.Build.0 = Release|Net3
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x64-Net4.ActiveCfg = Release|Net4
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x64-Net4.Build.0 = Release|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x86-Net3.ActiveCfg = Release|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x86-Net3.Build.0 = Release|Net3
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x86-Net4.ActiveCfg = Release|Net4
{5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose_Release|x86-Net4.Build.0 = Release|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64-Net3.ActiveCfg = Debug|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64-Net3.Build.0 = Debug|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64-Net4.ActiveCfg = Debug|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x64-Net4.Build.0 = Debug|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86-Net3.ActiveCfg = Debug|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86-Net3.Build.0 = Debug|Net3
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86-Net4.ActiveCfg = Debug|Net4
+ {5AD344F0-01A0-4CA8-92E5-9D095737744D}.Verbose|x86-Net4.Build.0 = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x64-Net3.ActiveCfg = Debug|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x64-Net3.Build.0 = Debug|Net3
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x64-Net4.ActiveCfg = Debug|Net4
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x64-Net4.Build.0 = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x86-Net3.ActiveCfg = Debug|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x86-Net3.Build.0 = Debug|Net3
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x86-Net4.ActiveCfg = Debug|Net4
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Debug|x86-Net4.Build.0 = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x64-Net3.ActiveCfg = Release|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x64-Net3.Build.0 = Release|Net3
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x64-Net4.ActiveCfg = Release|Net4
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x64-Net4.Build.0 = Release|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x86-Net3.ActiveCfg = Release|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x86-Net3.Build.0 = Release|Net3
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x86-Net4.ActiveCfg = Release|Net4
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Release|x86-Net4.Build.0 = Release|Net4
- {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64-Net4.ActiveCfg = Debug|Net4
- {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64-Net4.Build.0 = Debug|Net4
- {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86-Net4.ActiveCfg = Debug|Net4
- {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86-Net4.Build.0 = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x64-Net3.ActiveCfg = Release|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x64-Net3.Build.0 = Release|Net3
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x64-Net4.ActiveCfg = Release|Net4
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x64-Net4.Build.0 = Release|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x86-Net3.ActiveCfg = Release|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x86-Net3.Build.0 = Release|Net3
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x86-Net4.ActiveCfg = Release|Net4
{2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose_Release|x86-Net4.Build.0 = Release|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64-Net3.ActiveCfg = Debug|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64-Net3.Build.0 = Debug|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64-Net4.ActiveCfg = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x64-Net4.Build.0 = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86-Net3.ActiveCfg = Debug|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86-Net3.Build.0 = Debug|Net3
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86-Net4.ActiveCfg = Debug|Net4
+ {2A1AF16B-27F1-46E0-9A95-181516BC1CB7}.Verbose|x86-Net4.Build.0 = Debug|Net4
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x64-Net3.ActiveCfg = Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x64-Net3.Build.0 = Release|x64
{88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x64-Net4.ActiveCfg = Release|x64
{88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x64-Net4.Build.0 = Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x86-Net3.ActiveCfg = Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x86-Net3.Build.0 = Release|Win32
{88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x86-Net4.ActiveCfg = Release|Win32
{88609E16-731F-46C9-8139-6B1A7A83240D}.Debug|x86-Net4.Build.0 = Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x64-Net3.ActiveCfg = Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x64-Net3.Build.0 = Release|x64
{88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x64-Net4.ActiveCfg = Release|x64
{88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x64-Net4.Build.0 = Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x86-Net3.ActiveCfg = Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x86-Net3.Build.0 = Release|Win32
{88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x86-Net4.ActiveCfg = Release|Win32
{88609E16-731F-46C9-8139-6B1A7A83240D}.Release|x86-Net4.Build.0 = Release|Win32
- {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64-Net4.ActiveCfg = Verbose_Release|x64
- {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64-Net4.Build.0 = Verbose_Release|x64
- {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86-Net4.ActiveCfg = Verbose_Release|Win32
- {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86-Net4.Build.0 = Verbose_Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x64-Net3.ActiveCfg = Verbose_Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x64-Net3.Build.0 = Verbose_Release|x64
{88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x64-Net4.ActiveCfg = Verbose_Release|x64
{88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x64-Net4.Build.0 = Verbose_Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x86-Net3.ActiveCfg = Verbose_Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x86-Net3.Build.0 = Verbose_Release|Win32
{88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x86-Net4.ActiveCfg = Verbose_Release|Win32
{88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose_Release|x86-Net4.Build.0 = Verbose_Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64-Net3.ActiveCfg = Verbose_Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64-Net3.Build.0 = Verbose_Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64-Net4.ActiveCfg = Verbose_Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x64-Net4.Build.0 = Verbose_Release|x64
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86-Net3.ActiveCfg = Verbose_Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86-Net3.Build.0 = Verbose_Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86-Net4.ActiveCfg = Verbose_Release|Win32
+ {88609E16-731F-46C9-8139-6B1A7A83240D}.Verbose|x86-Net4.Build.0 = Verbose_Release|Win32
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x64-Net3.ActiveCfg = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x64-Net3.Build.0 = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x64-Net4.ActiveCfg = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x64-Net4.Build.0 = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x86-Net3.ActiveCfg = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x86-Net3.Build.0 = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x86-Net4.ActiveCfg = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Debug|x86-Net4.Build.0 = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Release|x64-Net3.ActiveCfg = Release|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Release|x64-Net4.ActiveCfg = Release|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Release|x86-Net3.ActiveCfg = Release|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Release|x86-Net4.ActiveCfg = Release|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose_Release|x64-Net3.ActiveCfg = Release|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose_Release|x64-Net4.ActiveCfg = Release|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose_Release|x86-Net3.ActiveCfg = Release|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose_Release|x86-Net4.ActiveCfg = Release|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x64-Net3.ActiveCfg = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x64-Net3.Build.0 = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x64-Net4.ActiveCfg = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x64-Net4.Build.0 = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x86-Net3.ActiveCfg = Debug|Any CPU
+ {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x86-Net3.Build.0 = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x86-Net4.ActiveCfg = Debug|Any CPU
{5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose|x86-Net4.Build.0 = Debug|Any CPU
- {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose_Release|x64-Net4.ActiveCfg = Release|Any CPU
- {5F33B310-DC8D-4C0D-877E-BAC3908DE10F}.Verbose_Release|x86-Net4.ActiveCfg = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x64-Net3.ActiveCfg = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x64-Net3.Build.0 = Debug|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x64-Net4.ActiveCfg = Debug|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x64-Net4.Build.0 = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x86-Net3.ActiveCfg = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x86-Net3.Build.0 = Debug|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x86-Net4.ActiveCfg = Debug|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Debug|x86-Net4.Build.0 = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x64-Net3.ActiveCfg = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x64-Net3.Build.0 = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x64-Net4.ActiveCfg = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x64-Net4.Build.0 = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x86-Net3.ActiveCfg = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x86-Net3.Build.0 = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x86-Net4.ActiveCfg = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Release|x86-Net4.Build.0 = Release|Any CPU
- {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x64-Net4.ActiveCfg = Debug|Any CPU
- {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x64-Net4.Build.0 = Debug|Any CPU
- {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x86-Net4.ActiveCfg = Debug|Any CPU
- {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x86-Net4.Build.0 = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x64-Net3.ActiveCfg = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x64-Net3.Build.0 = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x64-Net4.ActiveCfg = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x64-Net4.Build.0 = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x86-Net3.ActiveCfg = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x86-Net3.Build.0 = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x86-Net4.ActiveCfg = Release|Any CPU
{E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose_Release|x86-Net4.Build.0 = Release|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x64-Net3.ActiveCfg = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x64-Net3.Build.0 = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x64-Net4.ActiveCfg = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x64-Net4.Build.0 = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x86-Net3.ActiveCfg = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x86-Net3.Build.0 = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x86-Net4.ActiveCfg = Debug|Any CPU
+ {E2CCDD2F-1D4F-4B06-9CD4-E0D2B9AE543A}.Verbose|x86-Net4.Build.0 = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Debug|x64-Net3.ActiveCfg = Debug|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Debug|x64-Net4.ActiveCfg = Debug|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Debug|x64-Net4.Build.0 = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Debug|x86-Net3.ActiveCfg = Debug|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Debug|x86-Net4.ActiveCfg = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Release|x64-Net3.ActiveCfg = Release|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Release|x64-Net4.ActiveCfg = Release|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Release|x64-Net4.Build.0 = Release|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Release|x86-Net3.ActiveCfg = Release|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Release|x86-Net4.ActiveCfg = Release|Any CPU
- {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x64-Net4.ActiveCfg = Debug|Any CPU
- {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x64-Net4.Build.0 = Debug|Any CPU
- {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x86-Net4.ActiveCfg = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose_Release|x64-Net3.ActiveCfg = Release|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose_Release|x64-Net4.ActiveCfg = Release|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose_Release|x64-Net4.Build.0 = Release|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose_Release|x86-Net3.ActiveCfg = Release|Any CPU
{23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose_Release|x86-Net4.ActiveCfg = Release|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x64-Net3.ActiveCfg = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x64-Net4.ActiveCfg = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x64-Net4.Build.0 = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x86-Net3.ActiveCfg = Debug|Any CPU
+ {23AB2621-A05C-4377-8418-85E6012C0BBE}.Verbose|x86-Net4.ActiveCfg = Debug|Any CPU
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x64-Net3.ActiveCfg = Debug|x64-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x64-Net3.Build.0 = Debug|x64-Net3
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x64-Net4.ActiveCfg = Debug|x64-Net4
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x64-Net4.Build.0 = Debug|x64-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x86-Net3.ActiveCfg = Debug|x86-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x86-Net3.Build.0 = Debug|x86-Net3
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x86-Net4.ActiveCfg = Debug|x86-Net4
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Debug|x86-Net4.Build.0 = Debug|x86-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x64-Net3.ActiveCfg = Release|x64-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x64-Net3.Build.0 = Release|x64-Net3
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x64-Net4.ActiveCfg = Release|x64-Net4
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x64-Net4.Build.0 = Release|x64-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x86-Net3.ActiveCfg = Release|x86-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x86-Net3.Build.0 = Release|x86-Net3
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x86-Net4.ActiveCfg = Release|x86-Net4
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Release|x86-Net4.Build.0 = Release|x86-Net4
- {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x64-Net4.ActiveCfg = Verbose|x64-Net4
- {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x64-Net4.Build.0 = Verbose|x64-Net4
- {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x86-Net4.ActiveCfg = Verbose|x86-Net4
- {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x86-Net4.Build.0 = Verbose|x86-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x64-Net3.ActiveCfg = Verbose_Release|x64-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x64-Net3.Build.0 = Verbose_Release|x64-Net3
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x64-Net4.ActiveCfg = Verbose_Release|x64-Net4
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x64-Net4.Build.0 = Verbose_Release|x64-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x86-Net3.ActiveCfg = Verbose_Release|x86-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x86-Net3.Build.0 = Verbose_Release|x86-Net3
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x86-Net4.ActiveCfg = Verbose_Release|x86-Net4
{880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose_Release|x86-Net4.Build.0 = Verbose_Release|x86-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x64-Net3.ActiveCfg = Verbose|x64-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x64-Net3.Build.0 = Verbose|x64-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x64-Net4.ActiveCfg = Verbose|x64-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x64-Net4.Build.0 = Verbose|x64-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x86-Net3.ActiveCfg = Verbose|x86-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x86-Net3.Build.0 = Verbose|x86-Net3
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x86-Net4.ActiveCfg = Verbose|x86-Net4
+ {880A3560-82CD-4836-996B-11BEFE6B44DB}.Verbose|x86-Net4.Build.0 = Verbose|x86-Net4
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Debug|x64-Net3.ActiveCfg = Debug|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Debug|x64-Net3.Build.0 = Debug|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Debug|x64-Net4.ActiveCfg = Debug|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Debug|x86-Net3.ActiveCfg = Debug|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Debug|x86-Net3.Build.0 = Debug|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Debug|x86-Net4.ActiveCfg = Debug|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Release|x64-Net3.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Release|x64-Net3.Build.0 = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Release|x64-Net4.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Release|x86-Net3.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Release|x86-Net3.Build.0 = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Release|x86-Net4.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose_Release|x64-Net3.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose_Release|x64-Net3.Build.0 = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose_Release|x64-Net4.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose_Release|x86-Net3.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose_Release|x86-Net3.Build.0 = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose_Release|x86-Net4.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose|x64-Net3.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose|x64-Net3.Build.0 = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose|x64-Net4.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose|x86-Net3.ActiveCfg = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose|x86-Net3.Build.0 = Release|Any CPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}.Verbose|x86-Net4.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/IPA.Injector/IPA.Injector.csproj b/IPA.Injector/IPA.Injector.csproj
index 7b19e83d..00f52622 100644
--- a/IPA.Injector/IPA.Injector.csproj
+++ b/IPA.Injector/IPA.Injector.csproj
@@ -75,6 +75,10 @@
{5ad344f0-01a0-4ca8-92e5-9d095737744d}
IPA.Loader
+
+ {642F52DA-90F9-40E3-8784-6964F36752FB}
+ Net3-Proxy
+
@@ -118,6 +122,9 @@
1.2.0
+
+ 0.3.1
+
diff --git a/IPA.Loader/Config/Config.cs b/IPA.Loader/Config/Config.cs
index 126c2d50..3832b8f2 100644
--- a/IPA.Loader/Config/Config.cs
+++ b/IPA.Loader/Config/Config.cs
@@ -5,6 +5,10 @@ using System.Linq;
using System.Reflection;
using IPA.Config.ConfigProviders;
using IPA.Utilities;
+#if NET3
+using Net3_Proxy;
+using Path = Net3_Proxy.Path;
+#endif
namespace IPA.Config
{
diff --git a/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs b/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
index be81baea..476c76d3 100644
--- a/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
+++ b/IPA.Loader/Config/ConfigProviders/JsonConfigProvider.cs
@@ -18,8 +18,10 @@ namespace IPA.Config.ConfigProviders
private JObject jsonObj;
+#if NET4
// TODO: create a wrapper that allows empty object creation
public dynamic Dynamic => jsonObj;
+#endif
public bool HasChanged { get; private set; }
public bool InMemoryChanged { get; set; }
@@ -72,14 +74,18 @@ namespace IPA.Config.ConfigProviders
{
jsonObj.PropertyChanged += JsonObj_PropertyChanged;
jsonObj.ListChanged += JsonObj_ListChanged;
+#if NET4
jsonObj.CollectionChanged += JsonObj_CollectionChanged;
+#endif
}
+#if NET4
private void JsonObj_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
HasChanged = true;
InMemoryChanged = true;
}
+#endif
private void JsonObj_ListChanged(object sender, ListChangedEventArgs e)
{
diff --git a/IPA.Loader/Config/IConfigProvider.cs b/IPA.Loader/Config/IConfigProvider.cs
index 387c30c4..852e348b 100644
--- a/IPA.Loader/Config/IConfigProvider.cs
+++ b/IPA.Loader/Config/IConfigProvider.cs
@@ -21,13 +21,15 @@ namespace IPA.Config
/// the object containing the data to save
void Store(T obj);
+#if NET4
///
/// Gets a dynamic object providing access to the configuration.
///
/// a dynamically bound object to use to access config values directly
dynamic Dynamic { get; }
+#endif
- #region State getters
+#region State getters
///
/// Returns if object has changed since the last save
///
@@ -56,6 +58,6 @@ namespace IPA.Config
/// Loads the state of the file on disk.
///
void Load();
- #endregion
+#endregion
}
}
diff --git a/IPA.Loader/Config/ModPrefs.cs b/IPA.Loader/Config/ModPrefs.cs
index ba255d9c..a719db6b 100644
--- a/IPA.Loader/Config/ModPrefs.cs
+++ b/IPA.Loader/Config/ModPrefs.cs
@@ -2,6 +2,9 @@
using System.Globalization;
using System.IO;
using IPA.Loader;
+#if NET3
+using Path = Net3_Proxy.Path;
+#endif
namespace IPA.Config
{
diff --git a/IPA.Loader/IPA.Loader.csproj b/IPA.Loader/IPA.Loader.csproj
index d08415aa..fda47cea 100644
--- a/IPA.Loader/IPA.Loader.csproj
+++ b/IPA.Loader/IPA.Loader.csproj
@@ -78,6 +78,12 @@
False
+
+
+ {642F52DA-90F9-40E3-8784-6964F36752FB}
+ Net3-Proxy
+
+
@@ -149,6 +155,9 @@
1.2.0
+
+ 0.3.1
+
diff --git a/IPA.Loader/Loader/Features/Feature.cs b/IPA.Loader/Loader/Features/Feature.cs
index effd5dae..5817bc74 100644
--- a/IPA.Loader/Loader/Features/Feature.cs
+++ b/IPA.Loader/Loader/Features/Feature.cs
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Text;
+#if NET3
+using Net3_Proxy;
+#endif
namespace IPA.Loader.Features
{
diff --git a/IPA.Loader/Loader/PluginInitInjector.cs b/IPA.Loader/Loader/PluginInitInjector.cs
index 053bf2ce..7dc2679c 100644
--- a/IPA.Loader/Loader/PluginInitInjector.cs
+++ b/IPA.Loader/Loader/PluginInitInjector.cs
@@ -5,6 +5,9 @@ using System.Reflection;
using IPA.Config;
using IPA.Logging;
using IPA.Utilities;
+#if NET3
+using Net3_Proxy;
+#endif
namespace IPA.Loader
{
diff --git a/IPA.Loader/Loader/PluginLoader.cs b/IPA.Loader/Loader/PluginLoader.cs
index e3e75ea2..d30111f7 100644
--- a/IPA.Loader/Loader/PluginLoader.cs
+++ b/IPA.Loader/Loader/PluginLoader.cs
@@ -11,6 +11,11 @@ using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Version = SemVer.Version;
+#if NET3
+using Net3_Proxy;
+using Path = Net3_Proxy.Path;
+using File = Net3_Proxy.File;
+#endif
namespace IPA.Loader
{
@@ -19,7 +24,7 @@ namespace IPA.Loader
///
public class PluginLoader
{
- internal static Task LoadTask() => Task.Run(() =>
+ internal static Task LoadTask() => Task.Factory.StartNew(() =>
{
LoadMetadata();
diff --git a/IPA.Loader/Loader/PluginManager.cs b/IPA.Loader/Loader/PluginManager.cs
index d30f1c1d..05d0d8e4 100644
--- a/IPA.Loader/Loader/PluginManager.cs
+++ b/IPA.Loader/Loader/PluginManager.cs
@@ -13,6 +13,11 @@ using Mono.Cecil;
using UnityEngine;
using Logger = IPA.Logging.Logger;
using static IPA.Loader.PluginLoader;
+#if NET3
+using Net3_Proxy;
+using Path = Net3_Proxy.Path;
+using File = Net3_Proxy.File;
+#endif
namespace IPA.Loader
{
diff --git a/IPA.Loader/Logging/Printers/GZFilePrinter.cs b/IPA.Loader/Logging/Printers/GZFilePrinter.cs
index 0eafa958..64968295 100644
--- a/IPA.Loader/Logging/Printers/GZFilePrinter.cs
+++ b/IPA.Loader/Logging/Printers/GZFilePrinter.cs
@@ -4,6 +4,10 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
+#if NET3
+using Net3_Proxy;
+using Path = Net3_Proxy.Path;
+#endif
namespace IPA.Logging.Printers
{
diff --git a/IPA.Loader/Logging/Printers/PluginSubLogPrinter.cs b/IPA.Loader/Logging/Printers/PluginSubLogPrinter.cs
index 2b0e06dc..6e07c6f7 100644
--- a/IPA.Loader/Logging/Printers/PluginSubLogPrinter.cs
+++ b/IPA.Loader/Logging/Printers/PluginSubLogPrinter.cs
@@ -1,6 +1,9 @@
using System;
using System.IO;
using IPA.Utilities;
+#if NET3
+using Path = Net3_Proxy.Path;
+#endif
namespace IPA.Logging.Printers
{
diff --git a/IPA.Loader/Logging/StdoutInterceptor.cs b/IPA.Loader/Logging/StdoutInterceptor.cs
index e1d5fa29..5ef6aa71 100644
--- a/IPA.Loader/Logging/StdoutInterceptor.cs
+++ b/IPA.Loader/Logging/StdoutInterceptor.cs
@@ -121,8 +121,8 @@ namespace IPA.Logging
var console = typeof(Console);
var resetColor = console.GetMethod("ResetColor");
var foregroundProperty = console.GetProperty("ForegroundColor");
- var setFg = foregroundProperty.SetMethod;
- var getFg = foregroundProperty.GetMethod;
+ var setFg = foregroundProperty.GetSetMethod();
+ var getFg = foregroundProperty.GetGetMethod();
harmony.Patch(resetColor, transpiler: new HarmonyMethod(typeof(ConsoleHarmonyPatches), "PatchResetColor"));
harmony.Patch(setFg, transpiler: new HarmonyMethod(typeof(ConsoleHarmonyPatches), "PatchSetForegroundColor"));
diff --git a/IPA.Loader/Utilities/BeatSaber.cs b/IPA.Loader/Utilities/BeatSaber.cs
index 2f9e42c5..15fd15c8 100644
--- a/IPA.Loader/Utilities/BeatSaber.cs
+++ b/IPA.Loader/Utilities/BeatSaber.cs
@@ -2,7 +2,9 @@
using System.IO;
using System.Reflection;
using UnityEngine;
-using Version = SemVer.Version;
+#if NET3
+using Path = Net3_Proxy.Path;
+#endif
namespace IPA.Utilities
{
diff --git a/IPA.Loader/Utilities/Utils.cs b/IPA.Loader/Utilities/Utils.cs
index 6f71ecd1..a9270b83 100644
--- a/IPA.Loader/Utilities/Utils.cs
+++ b/IPA.Loader/Utilities/Utils.cs
@@ -1,6 +1,9 @@
using System;
using System.IO;
using System.Text;
+#if NET3
+using File = Net3_Proxy.File;
+#endif
namespace IPA.Utilities
{
diff --git a/Net3-Proxy/Extensions.cs b/Net3-Proxy/Extensions.cs
new file mode 100644
index 00000000..64386279
--- /dev/null
+++ b/Net3-Proxy/Extensions.cs
@@ -0,0 +1,167 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Net3_Proxy
+{
+ public static class Extensions
+ {
+ public static T GetCustomAttribute(this ParameterInfo element) where T : Attribute
+ => (T)GetCustomAttribute(element, typeof(T));
+
+ public static Attribute GetCustomAttribute(this MemberInfo element, Type attributeType)
+ => Attribute.GetCustomAttribute(element, attributeType);
+
+ public static Attribute GetCustomAttribute(this ParameterInfo element, Type attributeType)
+ => Attribute.GetCustomAttribute(element, attributeType);
+
+ public static StringBuilder Clear(this StringBuilder sb)
+ => sb.Remove(0, sb.Length);
+ }
+
+ public static class DirectoryInfoExtensions
+ {
+ public static IEnumerable EnumerateFiles(this DirectoryInfo self)
+ {
+ return self.EnumerateFiles("*", SearchOption.TopDirectoryOnly);
+ }
+
+ public static IEnumerable EnumerateFiles(this DirectoryInfo self, string searchPattern)
+ {
+ return self.EnumerateFiles(searchPattern, SearchOption.TopDirectoryOnly);
+ }
+
+ public static IEnumerable EnumerateFiles(this DirectoryInfo self, string searchPattern, SearchOption searchOption)
+ {
+ if (searchPattern == null)
+ {
+ throw new ArgumentNullException("searchPattern");
+ }
+ return CreateEnumerateFilesIterator(self, searchPattern, searchOption);
+ }
+
+
+ private static IEnumerable CreateEnumerateFilesIterator(DirectoryInfo self, string searchPattern, SearchOption searchOption)
+ {
+ foreach (string fileName in Directory.GetFiles(self.FullName, searchPattern, searchOption))
+ yield return new FileInfo(fileName);
+ yield break;
+ }
+ }
+
+ public static class StreamExtensions
+ {
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task CopyToAsync(this Stream src, Stream destination) => CopyToAsync(src, destination, 81920);
+
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task CopyToAsync(this Stream src, Stream destination, int bufferSize) => CopyToAsync(src, destination, bufferSize, CancellationToken.None);
+
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task CopyToAsync(this Stream src, Stream destination, int bufferSize, CancellationToken cancellationToken)
+ {
+ if (destination == null)
+ {
+ throw new ArgumentNullException("destination");
+ }
+ if (bufferSize <= 0)
+ {
+ throw new ArgumentOutOfRangeException("bufferSize", "Positive number required.");
+ }
+ if (!src.CanRead && !src.CanWrite)
+ {
+ throw new ObjectDisposedException(null, "Cannot access a closed Stream.");
+ }
+ if (!destination.CanRead && !destination.CanWrite)
+ {
+ throw new ObjectDisposedException("destination", "Cannot access a closed Stream.");
+ }
+ if (!src.CanRead)
+ {
+ throw new NotSupportedException("Stream does not support reading.");
+ }
+ if (!destination.CanWrite)
+ {
+ throw new NotSupportedException("Stream does not support writing.");
+ }
+ return CopyToAsyncInternal(src, destination, bufferSize, cancellationToken);
+ }
+
+ private static async Task CopyToAsyncInternal(Stream src, Stream destination, int bufferSize, CancellationToken cancellationToken)
+ {
+ byte[] buffer = new byte[bufferSize];
+ int bytesRead;
+ while ((bytesRead = await src.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) != 0)
+ {
+ await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken);
+ }
+ }
+
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task ReadAsync(this Stream src, byte[] buffer, int offset, int count)
+ {
+ return ReadAsync(src, buffer, offset, count, CancellationToken.None);
+ }
+
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task ReadAsync(this Stream src, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ if (!cancellationToken.IsCancellationRequested)
+ {
+ return BeginEndReadAsync(src, buffer, offset, count);
+ }
+ return new Task(() => 0, cancellationToken);
+ }
+
+ private static Task BeginEndReadAsync(Stream src, byte[] buffer, int offset, int count)
+ => Task.Factory.FromAsync(
+ (byte[] buffer_, int offset_, int count_, AsyncCallback callback, object state) =>
+ src.BeginRead(buffer_, offset_, count_, callback, state),
+ (IAsyncResult asyncResult) => src.EndRead(asyncResult),
+ buffer,
+ offset,
+ count,
+ new object());
+
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task WriteAsync(this Stream src, byte[] buffer, int offset, int count)
+ {
+ return WriteAsync(src, buffer, offset, count, CancellationToken.None);
+ }
+
+ [ComVisible(false)]
+ [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
+ public static Task WriteAsync(this Stream src, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ if (!cancellationToken.IsCancellationRequested)
+ {
+ return BeginEndWriteAsync(src, buffer, offset, count);
+ }
+ return new Task(() => 0, cancellationToken);
+ }
+
+ private static Task BeginEndWriteAsync(Stream src, byte[] buffer, int offset, int count)
+ => Task.Factory.FromAsync(
+ (byte[] buffer_, int offset_, int count_, AsyncCallback callback, object state) =>
+ src.BeginWrite(buffer_, offset_, count_, callback, state),
+ (IAsyncResult asyncResult) => src.EndWrite(asyncResult),
+ buffer,
+ offset,
+ count,
+ new object());
+
+ }
+}
diff --git a/Net3-Proxy/File.cs b/Net3-Proxy/File.cs
new file mode 100644
index 00000000..abd23c19
--- /dev/null
+++ b/Net3-Proxy/File.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using OgFile = System.IO.File;
+
+namespace Net3_Proxy
+{
+ public static class File
+ {
+ public static string ReadAllText(string fn) => OgFile.ReadAllText(fn);
+ public static string ReadAllText(string fn, Encoding enc) => OgFile.ReadAllText(fn, enc);
+ public static bool Exists(string fn) => OgFile.Exists(fn);
+ public static void Delete(string fn) => OgFile.Delete(fn);
+ public static void AppendAllLines(string path, IEnumerable contents)
+ {
+ Path.Validate(path);
+ if (contents == null)
+ return;
+ using (TextWriter textWriter = new StreamWriter(path, true))
+ foreach (string value in contents)
+ textWriter.WriteLine(value);
+ }
+ public static string[] ReadAllLines(string p) => OgFile.ReadAllLines(p);
+ }
+}
diff --git a/Net3-Proxy/IReadOnlyList.cs b/Net3-Proxy/IReadOnlyList.cs
new file mode 100644
index 00000000..c1690ac0
--- /dev/null
+++ b/Net3-Proxy/IReadOnlyList.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Net3_Proxy
+{
+
+ public class IReadOnlyList : IEnumerable
+ {
+ private IList list;
+
+ private IReadOnlyList(IList lst)
+ {
+ list = lst;
+ }
+
+ public IEnumerator GetEnumerator() => list.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)list).GetEnumerator();
+
+ public int Count => list.Count;
+
+ public T this[int index] => list[index];
+
+ public static implicit operator IReadOnlyList(List list) => new IReadOnlyList(list);
+ }
+}
diff --git a/Net3-Proxy/Net3-Proxy.csproj b/Net3-Proxy/Net3-Proxy.csproj
new file mode 100644
index 00000000..e05dcfd2
--- /dev/null
+++ b/Net3-Proxy/Net3-Proxy.csproj
@@ -0,0 +1,56 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {642F52DA-90F9-40E3-8784-6964F36752FB}
+ Library
+ Properties
+ Net3_Proxy
+ Net3-Proxy
+ v3.5
+ 512
+ true
+
+
+ true
+ portable
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ portable
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.3.1
+
+
+
+
\ No newline at end of file
diff --git a/Net3-Proxy/Path.cs b/Net3-Proxy/Path.cs
new file mode 100644
index 00000000..97a2a235
--- /dev/null
+++ b/Net3-Proxy/Path.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Linq;
+using OgPath = System.IO.Path;
+
+namespace Net3_Proxy
+{
+ public static class Path
+ {
+ internal static void Validate(string path)
+ {
+ Path.Validate(path, "path");
+ }
+
+ internal static void Validate(string path, string parameterName)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException(parameterName);
+ }
+ if (Utils.IsNullOrWhiteSpace(path))
+ {
+ throw new ArgumentException("Path is empty");
+ }
+ if (path.IndexOfAny(OgPath.GetInvalidPathChars()) != -1)
+ {
+ throw new ArgumentException("Path contains invalid chars");
+ }
+ if (Environment.OSVersion.Platform < PlatformID.Unix)
+ {
+ int num = path.IndexOf(':');
+ if (num >= 0 && num != 1)
+ {
+ throw new ArgumentException(parameterName);
+ }
+ }
+ }
+
+ public static string GetFullPath(string p) => OgPath.GetFullPath(p);
+ public static string GetFileNameWithoutExtension(string p) => OgPath.GetFileNameWithoutExtension(p);
+ public static string GetFileName(string p) => OgPath.GetFileName(p);
+ public static string GetDirectoryName(string p) => OgPath.GetDirectoryName(p);
+
+ public static string Combine(string s) => s;
+ public static string Combine(string s, string d) => OgPath.Combine(s, d);
+ public static string Combine(string s, string d, string f) => Combine(s, Combine(d, f));
+ public static string Combine(string s, string d, string f, string g) => Combine(Combine(s, d), Combine(f, g));
+ public static string Combine(params string[] parts)
+ {
+ if (parts.Length == 0) return "";
+ var begin = parts[0];
+ foreach (var p in parts.Skip(1))
+ begin = Combine(begin, p);
+ return begin;
+ }
+ }
+}
diff --git a/Net3-Proxy/Properties/AssemblyInfo.cs b/Net3-Proxy/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..109d9633
--- /dev/null
+++ b/Net3-Proxy/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+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("Net3-Proxy")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Net3-Proxy")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 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)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("642f52da-90f9-40e3-8784-6964f36752fb")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Net3-Proxy/Tuple.cs b/Net3-Proxy/Tuple.cs
new file mode 100644
index 00000000..5caebc5e
--- /dev/null
+++ b/Net3-Proxy/Tuple.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Net3_Proxy
+{
+ public static class Tuple
+ {
+ public static Tuple Create(T1 i1, T2 i2)
+ => new Tuple(i1, i2);
+
+ internal static int CombineHashCodes(int h1, int h2)
+ {
+ return (h1 << 5) + h1 ^ h2;
+ }
+ }
+
+ [Serializable]
+ public class Tuple : IComparable
+ {
+ public T1 Item1 { get; private set; }
+ public T2 Item2 { get; private set; }
+
+ public Tuple(T1 item1, T2 item2)
+ {
+ Item1 = item1;
+ Item2 = item2;
+ }
+
+ public override bool Equals(object obj)
+ => obj is Tuple tup
+ && Equals(Item1, tup.Item1)
+ && Equals(Item2, tup.Item2);
+
+ int IComparable.CompareTo(object obj)
+ {
+ if (obj == null) return 1;
+ var tup = obj as Tuple;
+ if (tup == null) throw new ArgumentException($"Argument must be of type {GetType()}.", "other");
+ int num = Comparer.Default.Compare(Item1, tup.Item1);
+ if (num != 0) return num;
+ return Comparer.Default.Compare(Item2, tup.Item2);
+ }
+
+ public override int GetHashCode() =>
+ Tuple.CombineHashCodes(EqualityComparer.Default.GetHashCode(Item1), EqualityComparer.Default.GetHashCode(Item2));
+
+ public override string ToString() =>
+ $"({Item1}, {Item2})";
+ }
+}
diff --git a/Net3-Proxy/Utils.cs b/Net3-Proxy/Utils.cs
new file mode 100644
index 00000000..9c0c66c4
--- /dev/null
+++ b/Net3-Proxy/Utils.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Net3_Proxy
+{
+ internal static class Utils
+ {
+ public static bool IsNullOrWhiteSpace(string value)
+ {
+ if (value == null)
+ {
+ return true;
+ }
+ for (int i = 0; i < value.Length; i++)
+ {
+ if (!char.IsWhiteSpace(value[i]))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+}