diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs index 65fdaf409672ee..28a4677d45eca5 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs @@ -40,5 +40,46 @@ public static unsafe bool TryGetRawMetadata(this Assembly assembly, out byte* bl return InternalTryGetRawMetadata(new QCallAssembly(ref rtAsm), ref blob, ref length); } + + [DllImport(RuntimeHelpers.QCall)] + private static extern unsafe void ApplyUpdate(QCallAssembly assembly, byte* metadataDelta, int metadataDeltaLength, byte* ilDelta, int ilDeltaLength, byte* pdbDelta, int pdbDeltaLength); + + /// + /// Updates the specified assembly using the provided metadata, IL and PDB deltas. + /// + /// + /// Currently executing methods will continue to use the existing IL. New executions of modified methods will + /// use the new IL. Different runtimes may have different limitations on what kinds of changes are supported, + /// and runtimes make no guarantees as to the state of the assembly and process if the delta includes + /// unsupported changes. + /// + /// The assembly to update. + /// The metadata changes to be applied. + /// The IL changes to be applied. + /// The PDB changes to be applied. + /// The assembly argument is null. + /// The update could not be applied. + public static void ApplyUpdate(Assembly assembly, ReadOnlySpan metadataDelta, ReadOnlySpan ilDelta, ReadOnlySpan pdbDelta) + { + if (assembly == null) + { + throw new ArgumentNullException(nameof(assembly)); + } + + RuntimeAssembly? runtimeAssembly = assembly as RuntimeAssembly; + if (runtimeAssembly == null) + { + throw new ArgumentException(SR.Argument_MustBeRuntimeAssembly); + } + + unsafe + { + RuntimeAssembly rtAsm = runtimeAssembly; + fixed (byte* metadataDeltaPtr = metadataDelta, ilDeltaPtr = ilDelta, pdbDeltaPtr = pdbDelta) + { + ApplyUpdate(new QCallAssembly(ref rtAsm), metadataDeltaPtr, metadataDelta.Length, ilDeltaPtr, ilDelta.Length, pdbDeltaPtr, pdbDelta.Length); + } + } + } } } diff --git a/src/coreclr/vm/assemblynative.cpp b/src/coreclr/vm/assemblynative.cpp index 432f16785b3fcc..165462e2a51643 100644 --- a/src/coreclr/vm/assemblynative.cpp +++ b/src/coreclr/vm/assemblynative.cpp @@ -25,6 +25,8 @@ #include "interoputil.h" #include "frames.h" #include "typeparse.h" +#include "encee.h" +#include "threadsuspend.h" #include "appdomainnative.hpp" #include "../binder/inc/bindertracing.h" @@ -1407,3 +1409,48 @@ void QCALLTYPE AssemblyNative::TraceSatelliteSubdirectoryPathProbed(LPCWSTR file END_QCALL; } + +// static +void QCALLTYPE AssemblyNative::ApplyUpdate( + QCall::AssemblyHandle assembly, + UINT8* metadataDelta, + INT32 metadataDeltaLength, + UINT8* ilDelta, + INT32 ilDeltaLength, + UINT8* pdbDelta, + INT32 pdbDeltaLength) +{ + QCALL_CONTRACT; + + BEGIN_QCALL; + + _ASSERTE(assembly != nullptr); + _ASSERTE(metadataDelta != nullptr); + _ASSERTE(metadataDeltaLength > 0); + _ASSERTE(ilDelta != nullptr); + _ASSERTE(ilDeltaLength > 0); + +#ifdef EnC_SUPPORTED + GCX_COOP(); + { + if (CORDebuggerAttached()) + { + COMPlusThrow(kNotSupportedException); + } + Module* pModule = assembly->GetDomainAssembly()->GetModule(); + if (!pModule->IsEditAndContinueEnabled()) + { + COMPlusThrow(kInvalidOperationException, W("InvalidOperation_AssemblyNotEditable")); + } + HRESULT hr = ((EditAndContinueModule*)pModule)->ApplyEditAndContinue(metadataDeltaLength, metadataDelta, ilDeltaLength, ilDelta); + if (FAILED(hr)) + { + COMPlusThrow(kInvalidOperationException, W("InvalidOperation_EditFailed")); + } + } +#else + COMPlusThrow(kNotImplementedException); +#endif + + END_QCALL; +} diff --git a/src/coreclr/vm/assemblynative.hpp b/src/coreclr/vm/assemblynative.hpp index 4ba91275b72ec0..25ebf74d5c8a6f 100644 --- a/src/coreclr/vm/assemblynative.hpp +++ b/src/coreclr/vm/assemblynative.hpp @@ -127,6 +127,8 @@ class AssemblyNative static void QCALLTYPE TraceAssemblyResolveHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath); static void QCALLTYPE TraceAssemblyLoadFromResolveHandlerInvoked(LPCWSTR assemblyName, bool isTrackedAssembly, LPCWSTR requestingAssemblyPath, LPCWSTR requestedAssemblyPath); static void QCALLTYPE TraceSatelliteSubdirectoryPathProbed(LPCWSTR filePath, HRESULT hr); + + static void QCALLTYPE ApplyUpdate(QCall::AssemblyHandle assembly, UINT8* metadataDelta, INT32 metadataDeltaLength, UINT8* ilDelta, INT32 ilDeltaLength, UINT8* pdbDelta, INT32 pdbDeltaLength); }; #endif diff --git a/src/coreclr/vm/ecalllist.h b/src/coreclr/vm/ecalllist.h index 64d1b07c6f9122..ef5aba3a1da4aa 100644 --- a/src/coreclr/vm/ecalllist.h +++ b/src/coreclr/vm/ecalllist.h @@ -440,6 +440,7 @@ FCFuncEnd() FCFuncStart(gAssemblyExtensionsFuncs) QCFuncElement("InternalTryGetRawMetadata", AssemblyNative::InternalTryGetRawMetadata) + QCFuncElement("ApplyUpdate", AssemblyNative::ApplyUpdate) FCFuncEnd() FCFuncStart(gAssemblyLoadContextFuncs) diff --git a/src/coreclr/vm/encee.cpp b/src/coreclr/vm/encee.cpp index a230ae29bb4844..1e724493ab6da8 100644 --- a/src/coreclr/vm/encee.cpp +++ b/src/coreclr/vm/encee.cpp @@ -173,9 +173,9 @@ HRESULT EditAndContinueModule::ApplyEditAndContinue( // Ensure the metadata is RW. EX_TRY { - // ConvertMetadataToRWForEnC should only ever be called on EnC capable files. + // ConvertMDInternalToReadWrite should only ever be called on EnC capable files. _ASSERTE(IsEditAndContinueCapable()); // this also checks that the file is EnC capable - GetFile()->ConvertMetadataToRWForEnC(); + GetFile()->ConvertMDInternalToReadWrite(); } EX_CATCH_HRESULT(hr); @@ -310,10 +310,13 @@ HRESULT EditAndContinueModule::UpdateMethod(MethodDesc *pMethod) CONTRACTL_END; // Notify the debugger of the update - HRESULT hr = g_pDebugInterface->UpdateFunction(pMethod, m_applyChangesCount); - if (FAILED(hr)) + if (CORDebuggerAttached()) { - return hr; + HRESULT hr = g_pDebugInterface->UpdateFunction(pMethod, m_applyChangesCount); + if (FAILED(hr)) + { + return hr; + } } // Notify the JIT that we've got new IL for this method @@ -375,7 +378,10 @@ HRESULT EditAndContinueModule::AddMethod(mdMethodDef token) // Class isn't loaded yet, don't have to modify any existing EE data structures beyond the metadata. // Just notify debugger and return. LOG((LF_ENC, LL_INFO100, "EnCModule::AM class %p not loaded, our work is done\n", parentTypeDef)); - hr = g_pDebugInterface->UpdateNotYetLoadedFunction(token, this, m_applyChangesCount); + if (CORDebuggerAttached()) + { + hr = g_pDebugInterface->UpdateNotYetLoadedFunction(token, this, m_applyChangesCount); + } return hr; } @@ -391,12 +397,15 @@ HRESULT EditAndContinueModule::AddMethod(mdMethodDef token) return hr; } - // Tell the debugger about the new method so it get's the version number properly - hr = g_pDebugInterface->AddFunction(pMethod, m_applyChangesCount); - if (FAILED(hr)) + // Tell the debugger about the new method so it gets the version number properly + if (CORDebuggerAttached()) { - _ASSERTE(!"Failed to add function"); - LOG((LF_ENC, LL_INFO100000, "**Error** EACM::AF: Failed to add method %p to debugger with hr 0x%x\n", token)); + hr = g_pDebugInterface->AddFunction(pMethod, m_applyChangesCount); + if (FAILED(hr)) + { + _ASSERTE(!"Failed to add function"); + LOG((LF_ENC, LL_INFO100000, "**Error** EACM::AF: Failed to add method %p to debugger with hr 0x%x\n", token)); + } } return hr; @@ -463,10 +472,13 @@ HRESULT EditAndContinueModule::AddField(mdFieldDef token) } // Tell the debugger about the new field - hr = g_pDebugInterface->AddField(pField, m_applyChangesCount); - if (FAILED(hr)) + if (CORDebuggerAttached()) { - LOG((LF_ENC, LL_INFO100000, "**Error** EACM::AF: Failed to add field %p to debugger with hr 0x%x\n", token)); + hr = g_pDebugInterface->AddField(pField, m_applyChangesCount); + if (FAILED(hr)) + { + LOG((LF_ENC, LL_INFO100000, "**Error** EACM::AF: Failed to add field %p to debugger with hr 0x%x\n", token)); + } } #ifdef _DEBUG diff --git a/src/coreclr/vm/pefile.cpp b/src/coreclr/vm/pefile.cpp index 406d76c11c1cbf..91069a74cb1dcb 100644 --- a/src/coreclr/vm/pefile.cpp +++ b/src/coreclr/vm/pefile.cpp @@ -747,30 +747,6 @@ void PEFile::ConvertMDInternalToReadWrite() } } -void PEFile::ConvertMetadataToRWForEnC() -{ - CONTRACTL - { - THROWS; - GC_NOTRIGGER; - MODE_ANY; - } - CONTRACTL_END; - - // This should only ever be called on EnC capable files. - // One can check this using Module::IsEditAndContinueCapable(). - - // This should only be called if we're debugging, stopped, and on the helper thread. - _ASSERTE(CORDebuggerAttached()); - _ASSERTE((g_pDebugInterface != NULL) && g_pDebugInterface->ThisIsHelperThread()); - _ASSERTE((g_pDebugInterface != NULL) && g_pDebugInterface->IsStopped()); - - // Convert the metadata to RW for Edit and Continue, properly replacing the metadata import interface pointer and - // properly preserving the old importer. This will be called before the EnC system tries to apply a delta to the module's - // metadata. ConvertMDInternalToReadWrite() does that quite nicely for us. - ConvertMDInternalToReadWrite(); -} - void PEFile::OpenMDImport_Unsafe() { CONTRACTL diff --git a/src/coreclr/vm/pefile.h b/src/coreclr/vm/pefile.h index 32eb4f48334447..7df6ef6f5290f6 100644 --- a/src/coreclr/vm/pefile.h +++ b/src/coreclr/vm/pefile.h @@ -427,7 +427,6 @@ class PEFile void OpenImporter(); void OpenEmitter(); - void ConvertMDInternalToReadWrite(); void ReleaseMetadataInterfaces(BOOL bDestructor, BOOL bKeepNativeData=FALSE); @@ -536,7 +535,7 @@ class PEFile static PEFile* Dummy(); void MarkNativeImageInvalidIfOwned(); - void ConvertMetadataToRWForEnC(); + void ConvertMDInternalToReadWrite(); protected: PTR_ICLRPrivAssembly m_pHostAssembly; diff --git a/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx b/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx index 69032d2d68e84a..d51bda348b4ad9 100644 --- a/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx +++ b/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx @@ -3673,4 +3673,10 @@ Use of ResourceManager for custom types is disabled. Set the MSBuild Property CustomResourceTypesSupport to true in order to enable it. + + The assembly can not be edited or changed. + + + The assembly update failed. + \ No newline at end of file diff --git a/src/libraries/System.Runtime.Loader/System.Runtime.Loader.sln b/src/libraries/System.Runtime.Loader/System.Runtime.Loader.sln index 2412cb539439a4..4767a7069d8300 100644 --- a/src/libraries/System.Runtime.Loader/System.Runtime.Loader.sln +++ b/src/libraries/System.Runtime.Loader/System.Runtime.Loader.sln @@ -1,4 +1,8 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31005.135 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Private.CoreLib", "..\..\coreclr\System.Private.CoreLib\System.Private.CoreLib.csproj", "{64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{D6D16FFD-FD76-4700-B456-1DC4D093D1B5}" @@ -7,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Win32.Registry", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Runtime.CompilerServices.Unsafe", "..\System.Runtime.CompilerServices.Unsafe\ref\System.Runtime.CompilerServices.Unsafe.csproj", "{8D19CD03-08EE-4574-B798-C658502C0A42}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Runtime.CompilerServices.Unsafe", "..\System.Runtime.CompilerServices.Unsafe\src\System.Runtime.CompilerServices.Unsafe.ilproj", "{074F38DA-36E1-4D2A-AEE6-3F783639ED9C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Runtime.CompilerServices.Unsafe", "..\System.Runtime.CompilerServices.Unsafe\src\System.Runtime.CompilerServices.Unsafe.ilproj", "{04BA3E3C-6979-4792-B19E-C797AD607F42}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "System.Runtime.Loader", "ref\System.Runtime.Loader.csproj", "{95B66B14-BCC7-407A-930C-4B34D4F7EC98}" EndProject @@ -48,41 +52,27 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0}" EndProject Global - GlobalSection(NestedProjects) = preSolution - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558} = {2AA50D1B-FD91-4748-85CF-33B2D265EBF6} - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C} = {2AA50D1B-FD91-4748-85CF-33B2D265EBF6} - {B8F22D73-B183-4F17-9D5E-04B80699E56A} = {2AA50D1B-FD91-4748-85CF-33B2D265EBF6} - {D6D16FFD-FD76-4700-B456-1DC4D093D1B5} = {C573CBE3-41F5-400D-A212-34889236C09C} - {76BE0621-CDAD-4808-8537-ADC9F028286B} = {C573CBE3-41F5-400D-A212-34889236C09C} - {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159} = {C573CBE3-41F5-400D-A212-34889236C09C} - {78BC94E5-2E23-40EF-863E-52AFCE838C96} = {C573CBE3-41F5-400D-A212-34889236C09C} - {7E785A7B-6ED6-4459-A07D-28DE1830C186} = {C573CBE3-41F5-400D-A212-34889236C09C} - {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902} = {C573CBE3-41F5-400D-A212-34889236C09C} - {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD} = {C573CBE3-41F5-400D-A212-34889236C09C} - {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD} = {C573CBE3-41F5-400D-A212-34889236C09C} - {44B22827-B9F0-4ADC-969C-7EC647D0B82A} = {C573CBE3-41F5-400D-A212-34889236C09C} - {49B0A873-5834-45A4-9495-E1063005CB82} = {C573CBE3-41F5-400D-A212-34889236C09C} - {E60DD367-D1D7-4F6C-919B-DC68E8445E97} = {C573CBE3-41F5-400D-A212-34889236C09C} - {9AD657ED-396B-4BE7-BCB6-BCA130825418} = {C573CBE3-41F5-400D-A212-34889236C09C} - {29E02AA9-E3D5-400C-B2C5-970B6E6D8562} = {C573CBE3-41F5-400D-A212-34889236C09C} - {E046E80F-B18A-463E-82D3-9755F9F8D8E9} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} - {8D19CD03-08EE-4574-B798-C658502C0A42} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} - {95B66B14-BCC7-407A-930C-4B34D4F7EC98} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} - {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} - {9D650A86-9EB5-41E6-89CE-B2A302D4F33F} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} + GlobalSection(SharedMSBuildProjectFiles) = preSolution + ..\System.Private.CoreLib\src\System.Private.CoreLib.Shared.projitems*{64ddd2af-bf90-4dd8-ac24-d2084db8d558}*SharedItemsImports = 5 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution + Checked|Any CPU = Checked|Any CPU + Checked|x64 = Checked|x64 + Checked|x86 = Checked|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 - Checked|Any CPU = Checked|Any CPU - Checked|x64 = Checked|x64 - Checked|x86 = Checked|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|Any CPU.ActiveCfg = Checked|x64 + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|Any CPU.Build.0 = Checked|x64 + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x64.ActiveCfg = Checked|x64 + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x64.Build.0 = Checked|x64 + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x86.ActiveCfg = Checked|x86 + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x86.Build.0 = Checked|x86 {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Debug|Any CPU.ActiveCfg = Debug|x64 {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Debug|Any CPU.Build.0 = Debug|x64 {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Debug|x64.ActiveCfg = Debug|x64 @@ -95,12 +85,9 @@ Global {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Release|x64.Build.0 = Release|x64 {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Release|x86.ActiveCfg = Release|x86 {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Release|x86.Build.0 = Release|x86 - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|Any CPU.ActiveCfg = Checked|x64 - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|Any CPU.Build.0 = Checked|x64 - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x64.ActiveCfg = Checked|x64 - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x64.Build.0 = Checked|x64 - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x86.ActiveCfg = Checked|x86 - {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558}.Checked|x86.Build.0 = Checked|x86 + {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Checked|x64.ActiveCfg = Debug|Any CPU + {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Checked|x86.ActiveCfg = Debug|Any CPU {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -113,9 +100,9 @@ Global {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Release|x64.Build.0 = Release|Any CPU {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Release|x86.ActiveCfg = Release|Any CPU {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Release|x86.Build.0 = Release|Any CPU - {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Checked|x64.ActiveCfg = Debug|Any CPU - {D6D16FFD-FD76-4700-B456-1DC4D093D1B5}.Checked|x86.ActiveCfg = Debug|Any CPU + {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Checked|x64.ActiveCfg = Debug|Any CPU + {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Checked|x86.ActiveCfg = Debug|Any CPU {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Debug|Any CPU.Build.0 = Debug|Any CPU {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -128,9 +115,9 @@ Global {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Release|x64.Build.0 = Release|Any CPU {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Release|x86.ActiveCfg = Release|Any CPU {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Release|x86.Build.0 = Release|Any CPU - {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Checked|x64.ActiveCfg = Debug|Any CPU - {E046E80F-B18A-463E-82D3-9755F9F8D8E9}.Checked|x86.ActiveCfg = Debug|Any CPU + {8D19CD03-08EE-4574-B798-C658502C0A42}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8D19CD03-08EE-4574-B798-C658502C0A42}.Checked|x64.ActiveCfg = Debug|Any CPU + {8D19CD03-08EE-4574-B798-C658502C0A42}.Checked|x86.ActiveCfg = Debug|Any CPU {8D19CD03-08EE-4574-B798-C658502C0A42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D19CD03-08EE-4574-B798-C658502C0A42}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D19CD03-08EE-4574-B798-C658502C0A42}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -143,24 +130,24 @@ Global {8D19CD03-08EE-4574-B798-C658502C0A42}.Release|x64.Build.0 = Release|Any CPU {8D19CD03-08EE-4574-B798-C658502C0A42}.Release|x86.ActiveCfg = Release|Any CPU {8D19CD03-08EE-4574-B798-C658502C0A42}.Release|x86.Build.0 = Release|Any CPU - {8D19CD03-08EE-4574-B798-C658502C0A42}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8D19CD03-08EE-4574-B798-C658502C0A42}.Checked|x64.ActiveCfg = Debug|Any CPU - {8D19CD03-08EE-4574-B798-C658502C0A42}.Checked|x86.ActiveCfg = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Debug|x64.ActiveCfg = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Debug|x64.Build.0 = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Debug|x86.ActiveCfg = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Debug|x86.Build.0 = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Release|Any CPU.Build.0 = Release|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Release|x64.ActiveCfg = Release|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Release|x64.Build.0 = Release|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Release|x86.ActiveCfg = Release|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Release|x86.Build.0 = Release|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Checked|x64.ActiveCfg = Debug|Any CPU - {074F38DA-36E1-4D2A-AEE6-3F783639ED9C}.Checked|x86.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Checked|x64.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Checked|x86.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Debug|x64.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Debug|x64.Build.0 = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Debug|x86.ActiveCfg = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Debug|x86.Build.0 = Debug|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Release|Any CPU.Build.0 = Release|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Release|x64.ActiveCfg = Release|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Release|x64.Build.0 = Release|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Release|x86.ActiveCfg = Release|Any CPU + {04BA3E3C-6979-4792-B19E-C797AD607F42}.Release|x86.Build.0 = Release|Any CPU + {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Checked|x64.ActiveCfg = Debug|Any CPU + {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Checked|x86.ActiveCfg = Debug|Any CPU {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Debug|Any CPU.Build.0 = Debug|Any CPU {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -173,9 +160,9 @@ Global {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Release|x64.Build.0 = Release|Any CPU {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Release|x86.ActiveCfg = Release|Any CPU {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Release|x86.Build.0 = Release|Any CPU - {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Checked|x64.ActiveCfg = Debug|Any CPU - {95B66B14-BCC7-407A-930C-4B34D4F7EC98}.Checked|x86.ActiveCfg = Debug|Any CPU + {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Checked|x64.ActiveCfg = Debug|Any CPU + {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Checked|x86.ActiveCfg = Debug|Any CPU {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Debug|Any CPU.Build.0 = Debug|Any CPU {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -188,9 +175,9 @@ Global {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Release|x64.Build.0 = Release|Any CPU {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Release|x86.ActiveCfg = Release|Any CPU {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Release|x86.Build.0 = Release|Any CPU - {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Checked|x64.ActiveCfg = Debug|Any CPU - {B8F22D73-B183-4F17-9D5E-04B80699E56A}.Checked|x86.ActiveCfg = Debug|Any CPU + {76BE0621-CDAD-4808-8537-ADC9F028286B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {76BE0621-CDAD-4808-8537-ADC9F028286B}.Checked|x64.ActiveCfg = Debug|Any CPU + {76BE0621-CDAD-4808-8537-ADC9F028286B}.Checked|x86.ActiveCfg = Debug|Any CPU {76BE0621-CDAD-4808-8537-ADC9F028286B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76BE0621-CDAD-4808-8537-ADC9F028286B}.Debug|Any CPU.Build.0 = Debug|Any CPU {76BE0621-CDAD-4808-8537-ADC9F028286B}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -203,9 +190,9 @@ Global {76BE0621-CDAD-4808-8537-ADC9F028286B}.Release|x64.Build.0 = Release|Any CPU {76BE0621-CDAD-4808-8537-ADC9F028286B}.Release|x86.ActiveCfg = Release|Any CPU {76BE0621-CDAD-4808-8537-ADC9F028286B}.Release|x86.Build.0 = Release|Any CPU - {76BE0621-CDAD-4808-8537-ADC9F028286B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {76BE0621-CDAD-4808-8537-ADC9F028286B}.Checked|x64.ActiveCfg = Debug|Any CPU - {76BE0621-CDAD-4808-8537-ADC9F028286B}.Checked|x86.ActiveCfg = Debug|Any CPU + {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Checked|x64.ActiveCfg = Debug|Any CPU + {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Checked|x86.ActiveCfg = Debug|Any CPU {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Debug|Any CPU.Build.0 = Debug|Any CPU {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -218,9 +205,9 @@ Global {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Release|x64.Build.0 = Release|Any CPU {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Release|x86.ActiveCfg = Release|Any CPU {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Release|x86.Build.0 = Release|Any CPU - {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Checked|x64.ActiveCfg = Debug|Any CPU - {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159}.Checked|x86.ActiveCfg = Debug|Any CPU + {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Checked|x64.ActiveCfg = Debug|Any CPU + {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Checked|x86.ActiveCfg = Debug|Any CPU {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Debug|Any CPU.Build.0 = Debug|Any CPU {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -233,9 +220,9 @@ Global {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Release|x64.Build.0 = Release|Any CPU {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Release|x86.ActiveCfg = Release|Any CPU {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Release|x86.Build.0 = Release|Any CPU - {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Checked|x64.ActiveCfg = Debug|Any CPU - {78BC94E5-2E23-40EF-863E-52AFCE838C96}.Checked|x86.ActiveCfg = Debug|Any CPU + {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Checked|x64.ActiveCfg = Debug|Any CPU + {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Checked|x86.ActiveCfg = Debug|Any CPU {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -248,9 +235,9 @@ Global {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Release|x64.Build.0 = Release|Any CPU {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Release|x86.ActiveCfg = Release|Any CPU {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Release|x86.Build.0 = Release|Any CPU - {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Checked|x64.ActiveCfg = Debug|Any CPU - {7E785A7B-6ED6-4459-A07D-28DE1830C186}.Checked|x86.ActiveCfg = Debug|Any CPU + {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Checked|x64.ActiveCfg = Debug|Any CPU + {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Checked|x86.ActiveCfg = Debug|Any CPU {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -263,9 +250,9 @@ Global {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Release|x64.Build.0 = Release|Any CPU {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Release|x86.ActiveCfg = Release|Any CPU {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Release|x86.Build.0 = Release|Any CPU - {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Checked|x64.ActiveCfg = Debug|Any CPU - {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902}.Checked|x86.ActiveCfg = Debug|Any CPU + {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Checked|x64.ActiveCfg = Debug|Any CPU + {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Checked|x86.ActiveCfg = Debug|Any CPU {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Debug|Any CPU.Build.0 = Debug|Any CPU {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -278,9 +265,9 @@ Global {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Release|x64.Build.0 = Release|Any CPU {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Release|x86.ActiveCfg = Release|Any CPU {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Release|x86.Build.0 = Release|Any CPU - {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Checked|x64.ActiveCfg = Debug|Any CPU - {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD}.Checked|x86.ActiveCfg = Debug|Any CPU + {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Checked|x64.ActiveCfg = Debug|Any CPU + {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Checked|x86.ActiveCfg = Debug|Any CPU {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Debug|Any CPU.Build.0 = Debug|Any CPU {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -293,9 +280,9 @@ Global {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Release|x64.Build.0 = Release|Any CPU {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Release|x86.ActiveCfg = Release|Any CPU {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Release|x86.Build.0 = Release|Any CPU - {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Checked|x64.ActiveCfg = Debug|Any CPU - {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD}.Checked|x86.ActiveCfg = Debug|Any CPU + {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Checked|x64.ActiveCfg = Debug|Any CPU + {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Checked|x86.ActiveCfg = Debug|Any CPU {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Debug|Any CPU.Build.0 = Debug|Any CPU {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -308,9 +295,9 @@ Global {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Release|x64.Build.0 = Release|Any CPU {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Release|x86.ActiveCfg = Release|Any CPU {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Release|x86.Build.0 = Release|Any CPU - {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Checked|x64.ActiveCfg = Debug|Any CPU - {44B22827-B9F0-4ADC-969C-7EC647D0B82A}.Checked|x86.ActiveCfg = Debug|Any CPU + {49B0A873-5834-45A4-9495-E1063005CB82}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {49B0A873-5834-45A4-9495-E1063005CB82}.Checked|x64.ActiveCfg = Debug|Any CPU + {49B0A873-5834-45A4-9495-E1063005CB82}.Checked|x86.ActiveCfg = Debug|Any CPU {49B0A873-5834-45A4-9495-E1063005CB82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {49B0A873-5834-45A4-9495-E1063005CB82}.Debug|Any CPU.Build.0 = Debug|Any CPU {49B0A873-5834-45A4-9495-E1063005CB82}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -323,9 +310,9 @@ Global {49B0A873-5834-45A4-9495-E1063005CB82}.Release|x64.Build.0 = Release|Any CPU {49B0A873-5834-45A4-9495-E1063005CB82}.Release|x86.ActiveCfg = Release|Any CPU {49B0A873-5834-45A4-9495-E1063005CB82}.Release|x86.Build.0 = Release|Any CPU - {49B0A873-5834-45A4-9495-E1063005CB82}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {49B0A873-5834-45A4-9495-E1063005CB82}.Checked|x64.ActiveCfg = Debug|Any CPU - {49B0A873-5834-45A4-9495-E1063005CB82}.Checked|x86.ActiveCfg = Debug|Any CPU + {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Checked|x64.ActiveCfg = Debug|Any CPU + {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Checked|x86.ActiveCfg = Debug|Any CPU {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Debug|Any CPU.Build.0 = Debug|Any CPU {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -338,9 +325,9 @@ Global {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Release|x64.Build.0 = Release|Any CPU {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Release|x86.ActiveCfg = Release|Any CPU {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Release|x86.Build.0 = Release|Any CPU - {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Checked|x64.ActiveCfg = Debug|Any CPU - {E60DD367-D1D7-4F6C-919B-DC68E8445E97}.Checked|x86.ActiveCfg = Debug|Any CPU + {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Checked|x64.ActiveCfg = Debug|Any CPU + {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Checked|x86.ActiveCfg = Debug|Any CPU {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Debug|Any CPU.Build.0 = Debug|Any CPU {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -353,9 +340,9 @@ Global {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Release|x64.Build.0 = Release|Any CPU {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Release|x86.ActiveCfg = Release|Any CPU {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Release|x86.Build.0 = Release|Any CPU - {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Checked|x64.ActiveCfg = Debug|Any CPU - {9AD657ED-396B-4BE7-BCB6-BCA130825418}.Checked|x86.ActiveCfg = Debug|Any CPU + {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Checked|x64.ActiveCfg = Debug|Any CPU + {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Checked|x86.ActiveCfg = Debug|Any CPU {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Debug|Any CPU.Build.0 = Debug|Any CPU {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -368,9 +355,9 @@ Global {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Release|x64.Build.0 = Release|Any CPU {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Release|x86.ActiveCfg = Release|Any CPU {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Release|x86.Build.0 = Release|Any CPU - {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Checked|x64.ActiveCfg = Debug|Any CPU - {29E02AA9-E3D5-400C-B2C5-970B6E6D8562}.Checked|x86.ActiveCfg = Debug|Any CPU + {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Checked|x64.ActiveCfg = Debug|Any CPU + {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Checked|x86.ActiveCfg = Debug|Any CPU {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Debug|Any CPU.Build.0 = Debug|Any CPU {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -383,9 +370,9 @@ Global {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Release|x64.Build.0 = Release|Any CPU {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Release|x86.ActiveCfg = Release|Any CPU {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Release|x86.Build.0 = Release|Any CPU - {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Checked|x64.ActiveCfg = Debug|Any CPU - {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1}.Checked|x86.ActiveCfg = Debug|Any CPU + {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Checked|x64.ActiveCfg = Debug|Any CPU + {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Checked|x86.ActiveCfg = Debug|Any CPU {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -398,13 +385,33 @@ Global {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Release|x64.Build.0 = Release|Any CPU {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Release|x86.ActiveCfg = Release|Any CPU {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Release|x86.Build.0 = Release|Any CPU - {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Checked|x64.ActiveCfg = Debug|Any CPU - {9D650A86-9EB5-41E6-89CE-B2A302D4F33F}.Checked|x86.ActiveCfg = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {64DDD2AF-BF90-4DD8-AC24-D2084DB8D558} = {2AA50D1B-FD91-4748-85CF-33B2D265EBF6} + {D6D16FFD-FD76-4700-B456-1DC4D093D1B5} = {C573CBE3-41F5-400D-A212-34889236C09C} + {E046E80F-B18A-463E-82D3-9755F9F8D8E9} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} + {8D19CD03-08EE-4574-B798-C658502C0A42} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} + {04BA3E3C-6979-4792-B19E-C797AD607F42} = {2AA50D1B-FD91-4748-85CF-33B2D265EBF6} + {95B66B14-BCC7-407A-930C-4B34D4F7EC98} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} + {B8F22D73-B183-4F17-9D5E-04B80699E56A} = {2AA50D1B-FD91-4748-85CF-33B2D265EBF6} + {76BE0621-CDAD-4808-8537-ADC9F028286B} = {C573CBE3-41F5-400D-A212-34889236C09C} + {8EB6F6F0-FD8C-44C8-A9D8-18854C3C2159} = {C573CBE3-41F5-400D-A212-34889236C09C} + {78BC94E5-2E23-40EF-863E-52AFCE838C96} = {C573CBE3-41F5-400D-A212-34889236C09C} + {7E785A7B-6ED6-4459-A07D-28DE1830C186} = {C573CBE3-41F5-400D-A212-34889236C09C} + {F0CEA7EB-E8B5-482A-AB6C-3E12992F2902} = {C573CBE3-41F5-400D-A212-34889236C09C} + {CA8B6E49-5EAF-4B7C-A141-6D83DD8D8AFD} = {C573CBE3-41F5-400D-A212-34889236C09C} + {10699CE6-A1B3-4C14-93E0-CB5CF3292BDD} = {C573CBE3-41F5-400D-A212-34889236C09C} + {44B22827-B9F0-4ADC-969C-7EC647D0B82A} = {C573CBE3-41F5-400D-A212-34889236C09C} + {49B0A873-5834-45A4-9495-E1063005CB82} = {C573CBE3-41F5-400D-A212-34889236C09C} + {E60DD367-D1D7-4F6C-919B-DC68E8445E97} = {C573CBE3-41F5-400D-A212-34889236C09C} + {9AD657ED-396B-4BE7-BCB6-BCA130825418} = {C573CBE3-41F5-400D-A212-34889236C09C} + {29E02AA9-E3D5-400C-B2C5-970B6E6D8562} = {C573CBE3-41F5-400D-A212-34889236C09C} + {E38F7C05-A856-47AF-B210-5FE1EDB1DBF1} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} + {9D650A86-9EB5-41E6-89CE-B2A302D4F33F} = {52AEFCDE-2CD8-4DE0-91DA-2B0B2AC32FD0} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {73D0667D-A181-41CA-B57B-DD177166E019} EndGlobalSection diff --git a/src/libraries/System.Runtime.Loader/ref/System.Runtime.Loader.cs b/src/libraries/System.Runtime.Loader/ref/System.Runtime.Loader.cs index a942f9030c0d63..8279cfa8b9c43e 100644 --- a/src/libraries/System.Runtime.Loader/ref/System.Runtime.Loader.cs +++ b/src/libraries/System.Runtime.Loader/ref/System.Runtime.Loader.cs @@ -10,6 +10,7 @@ public static partial class AssemblyExtensions { [System.CLSCompliantAttribute(false)] public unsafe static bool TryGetRawMetadata(this System.Reflection.Assembly assembly, out byte* blob, out int length) { throw null; } + public static void ApplyUpdate(Assembly assembly, ReadOnlySpan metadataDelta, ReadOnlySpan ilDelta, ReadOnlySpan pdbDelta) { throw null; } } } namespace System.Runtime.Loader diff --git a/src/libraries/System.Runtime.Loader/tests/AssemblyExtensionsTest.cs b/src/libraries/System.Runtime.Loader/tests/AssemblyExtensionsTest.cs new file mode 100644 index 00000000000000..c254e1b67e2bed --- /dev/null +++ b/src/libraries/System.Runtime.Loader/tests/AssemblyExtensionsTest.cs @@ -0,0 +1,37 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Xunit; + +namespace System.Reflection.Metadata +{ + public class AssemblyExtensionsTest + { + class NonRuntimeAssembly : Assembly + { + } + + [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/45689", platforms: TestPlatforms.AnyUnix, runtimes: TestRuntimes.Mono)] + [PlatformSpecific(TestPlatforms.Windows)] + [SkipOnMono("Not yet implemented on Mono")] + public static void ApplyUpdateInvalidParameters() + { + // Dummy delta arrays + var metadataDelta = new byte[20]; + var ilDelta = new byte[20]; + + // Assembly can't be null + Assert.Throws("assembly", () => + AssemblyExtensions.ApplyUpdate(null, new ReadOnlySpan(metadataDelta), new ReadOnlySpan(ilDelta), ReadOnlySpan.Empty)); + + // Tests fail on non-runtime assemblies + Assert.Throws(() => + AssemblyExtensions.ApplyUpdate(new NonRuntimeAssembly(), new ReadOnlySpan(metadataDelta), new ReadOnlySpan(ilDelta), ReadOnlySpan.Empty)); + + // Tests that this assembly isn't not editable + Assert.Throws(() => + AssemblyExtensions.ApplyUpdate(typeof(AssemblyExtensions).Assembly, new ReadOnlySpan(metadataDelta), new ReadOnlySpan(ilDelta), ReadOnlySpan.Empty)); + } + } +} diff --git a/src/libraries/System.Runtime.Loader/tests/System.Runtime.Loader.Tests.csproj b/src/libraries/System.Runtime.Loader/tests/System.Runtime.Loader.Tests.csproj index ae825641dab5e3..11c1b7577fff9d 100644 --- a/src/libraries/System.Runtime.Loader/tests/System.Runtime.Loader.Tests.csproj +++ b/src/libraries/System.Runtime.Loader/tests/System.Runtime.Loader.Tests.csproj @@ -8,6 +8,7 @@ false + diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs index dbffc31b016c51..2f6e1e65e557c8 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs @@ -7,5 +7,7 @@ public static class AssemblyExtensions { [CLSCompliant(false)] public static unsafe bool TryGetRawMetadata(this Assembly assembly, out byte* blob, out int length) => throw new NotImplementedException(); + + public static void ApplyUpdate(Assembly assembly, ReadOnlySpan metadataDelta, ReadOnlySpan ilDelta, ReadOnlySpan pdbDelta) => throw new NotImplementedException(); } }