From 4ed10d7ccfd264f973e158c7f5324cf875032764 Mon Sep 17 00:00:00 2001 From: Michael Ketting Date: Mon, 21 Oct 2024 08:46:55 +0200 Subject: [PATCH 1/4] temp TODO: Change FEATURE_ASSEMBLYBUILDER_SAVE to FEATURE_ASSEMBLYBUILDER_SAVE AND NET9 --- .../Abstractions/AssemblyBuilderAdapter.cs | 16 +++++++++++++++- .../Abstractions/ModuleBuilderAdapter.cs | 8 ++++++++ .../ReflectionEmit/ModuleBuilderFactory.cs | 14 ++++++++++++-- Core/Dlr/Compiler/AssemblyGen.cs | 4 ++-- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs b/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs index 0c2f5e2a1..e56cec931 100644 --- a/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs +++ b/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs @@ -20,15 +20,29 @@ namespace Remotion.TypePipe.CodeGeneration.ReflectionEmit.Abstractions { +#if NET9_0_OR_GREATER + /// + /// Adapts with the interface. + /// +#else /// /// Adapts with the interface. /// +#endif public class AssemblyBuilderAdapter : BuilderAdapterBase, IAssemblyBuilder { +#if NET9_0_OR_GREATER + private readonly PersistedAssemblyBuilder _assemblyBuilder; +#else private readonly AssemblyBuilder _assemblyBuilder; +#endif private readonly ModuleBuilder _moduleBuilder; +#if NET9_0_OR_GREATER + public AssemblyBuilderAdapter (PersistedAssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) +#else public AssemblyBuilderAdapter (AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) +#endif : base (ArgumentUtility.CheckNotNull ("assemblyBuilder", assemblyBuilder).SetCustomAttribute) { ArgumentUtility.CheckNotNull ("moduleBuilder", moduleBuilder); @@ -49,7 +63,7 @@ public byte[] PublicKey public string SaveToDisk () { -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK || NET9_0_OR_GREATER // Scope name is the module name or file name, i.e., assembly name + '.dll'. _assemblyBuilder.Save (_moduleBuilder.ScopeName); diff --git a/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs b/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs index fd2132983..4ff0c9030 100644 --- a/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs +++ b/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs @@ -42,10 +42,18 @@ public IAssemblyBuilder AssemblyBuilder public ModuleBuilderAdapter (ModuleBuilder moduleBuilder) : base (ArgumentUtility.CheckNotNull ("moduleBuilder", moduleBuilder).SetCustomAttribute) { +#if NET9_0_OR_GREATER + Assertion.IsTrue (moduleBuilder.Assembly is PersistedAssemblyBuilder); +#else Assertion.IsTrue (moduleBuilder.Assembly is AssemblyBuilder); +#endif _moduleBuilder = moduleBuilder; +#if NET9_0_OR_GREATER + _assemblyBuilder = new AssemblyBuilderAdapter ((PersistedAssemblyBuilder) moduleBuilder.Assembly, moduleBuilder); +#else _assemblyBuilder = new AssemblyBuilderAdapter (((AssemblyBuilder) moduleBuilder.Assembly), moduleBuilder); +#endif } [CLSCompliant (false)] diff --git a/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs b/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs index 9dbf101aa..7a15c94da 100644 --- a/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs +++ b/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs @@ -27,7 +27,7 @@ namespace Remotion.TypePipe.CodeGeneration.ReflectionEmit { -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK /// /// This class creates instances of . /// @@ -35,6 +35,14 @@ namespace Remotion.TypePipe.CodeGeneration.ReflectionEmit /// . /// /// +#elif NET9_0_OR_GREATER + /// + /// This class creates instances of . + /// + /// The module will be created with and the emitSymbolInfo flag set to + /// . + /// + /// #else /// /// This class creates instances of . @@ -70,8 +78,10 @@ public IModuleBuilder CreateModuleBuilder (string assemblyName, string assemblyD #endif } -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (assemName, AssemblyBuilderAccess.RunAndSave, assemblyDirectoryOrNull); +#elif NET9_0_OR_GREATER + var assemblyBuilder = new PersistedAssemblyBuilder (new AssemblyName(assemblyName), typeof(object).Assembly); #else var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly (assemName, AssemblyBuilderAccess.Run); #endif diff --git a/Core/Dlr/Compiler/AssemblyGen.cs b/Core/Dlr/Compiler/AssemblyGen.cs index 1317ba3b8..0da7d567a 100644 --- a/Core/Dlr/Compiler/AssemblyGen.cs +++ b/Core/Dlr/Compiler/AssemblyGen.cs @@ -60,13 +60,13 @@ private AssemblyGen() { _myAssembly = AssemblyBuilder.DefineDynamicAssembly (name, AssemblyBuilderAccess.Run, attributes); -#if FEATURE_PDBEMIT +#if NETFRAMEWORK _myModule = _myAssembly.DefineDynamicModule (name.Name, false); #else _myModule = _myAssembly.DefineDynamicModule (name.Name); #endif -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK _myAssembly.DefineVersionInfoResource(); #endif From 9932f6dbb36ac3084a97d7322bee24b04cb48630 Mon Sep 17 00:00:00 2001 From: Michael Ketting Date: Mon, 4 Nov 2024 13:52:02 +0100 Subject: [PATCH 2/4] RMTP-120 Integrate .NET 9 PersistentAssemblyBuilder --- .../ModuleBuilderFactoryTest.cs | 52 ++++++++----------- .../PEVerifier.cs | 2 +- .../DotNetSdk20PEVerifyPathSource.cs | 2 +- .../WindowsSdk6PEVerifyPathSource.cs | 2 +- .../WindowsSdk70aPEVerifyPathSource.cs | 2 +- .../WindowsSdk71PEVerifyPathSource.cs | 2 +- .../WindowsSdk80aPEVerifyPathSource.cs | 2 +- .../WindowsSdk81aPEVerifyPathSource.cs | 2 +- Development/AssemblyTrackingCodeManager.cs | 16 +++++- .../AssemblyTrackingPipelineFactory.cs | 2 +- .../PEVerifier.cs | 2 +- .../DotNetSdk20PEVerifyPathSource.cs | 2 +- .../WindowsSdk6PEVerifyPathSource.cs | 2 +- .../WindowsSdk70aPEVerifyPathSource.cs | 2 +- .../WindowsSdk71PEVerifyPathSource.cs | 2 +- .../WindowsSdk80aPEVerifyPathSource.cs | 2 +- .../WindowsSdk81aPEVerifyPathSource.cs | 2 +- IntegrationTests/IntegrationTestBase.cs | 15 ++++-- ...rencyTest_WithMultipleGenerationThreads.cs | 4 +- ...currencyTest_WithSingleGenerationThread.cs | 2 +- .../Pipeline/FlushGeneratedCodeTest.cs | 2 +- .../Pipeline/LoadFlushedCodeTest.cs | 2 +- .../Pipeline/ParticipantStateTest.cs | 2 +- Shared.build.props | 4 +- 24 files changed, 71 insertions(+), 58 deletions(-) diff --git a/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs b/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs index 856702ad8..35bc0e680 100644 --- a/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs +++ b/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs @@ -53,7 +53,7 @@ public void CreateModuleBuilder () var result = _factory.CreateModuleBuilder (c_assemblyName, assemblyDirectoryOrNull: null, strongNamed: false, keyFilePathOrNull: null); CheckAdapterBehavior (result); -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK || NET9_0_OR_GREATER CheckSaveToDiskBehavior (result, _currentDirectory); #endif } @@ -79,26 +79,18 @@ public void CreateModuleBuilder_CustomDirectory () var result = _factory.CreateModuleBuilder (c_assemblyName, tempDirectory, false, null); CheckAdapterBehavior (result); -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK || NET9_0_OR_GREATER CheckSaveToDiskBehavior (result, tempDirectory); #endif } [Test] +#if !FEATURE_STRONGNAMESIGNING + [Ignore("Platform does not support strong named assembly signing.")] +#endif public void CreateModuleBuilder_StrongNamed_FallbackKey () { - try - { - Dev.Null = FallbackKey.KeyPair.PublicKey; - } - catch (PlatformNotSupportedException) - { -#if FEATURE_ASSEMBLYBUILDER_SAVE - throw; -#else - Assert.Ignore (".NET does not support assembly persistence."); -#endif - } + Dev.Null = FallbackKey.KeyPair.PublicKey; var result1 = _factory.CreateModuleBuilder (c_assemblyName, assemblyDirectoryOrNull: null, strongNamed: true, keyFilePathOrNull: null); var result2 = _factory.CreateModuleBuilder (c_assemblyName, assemblyDirectoryOrNull: null, strongNamed: true, keyFilePathOrNull: string.Empty); @@ -113,20 +105,12 @@ public void CreateModuleBuilder_StrongNamed_FallbackKey () } [Test] +#if !FEATURE_STRONGNAMESIGNING + [Ignore("Platform does not support strong named assembly signing.")] +#endif public void CreateModuleBuilder_StrongNamed_ProvidedKey () { - try - { - Dev.Null = FallbackKey.KeyPair.PublicKey; - } - catch (PlatformNotSupportedException) - { -#if FEATURE_ASSEMBLYBUILDER_SAVE - throw; -#else - Assert.Ignore (".NET does not support assembly persistence."); -#endif - } + Dev.Null = FallbackKey.KeyPair.PublicKey; var otherKeyPath = Path.Combine (AppDomain.CurrentDomain.BaseDirectory, @"CodeGeneration\ReflectionEmit\OtherKey.snk"); var result = _factory.CreateModuleBuilder ( @@ -142,7 +126,7 @@ private void CheckAdapterBehavior (IModuleBuilder moduleBuilder, byte[] expected { Assert.That (moduleBuilder, Is.TypeOf()); var moduleBuilderAdapter = (ModuleBuilderAdapter) moduleBuilder; -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK || NET9_0_OR_GREATER Assert.That (moduleBuilderAdapter.ScopeName, Is.EqualTo (c_assemblyFileName)); #else // .NET5 as a hardcoded module name since it does not support AssemblyBuilder.Save(). @@ -152,20 +136,26 @@ private void CheckAdapterBehavior (IModuleBuilder moduleBuilder, byte[] expected var assemblyBuilderAdapter = (AssemblyBuilderAdapter) moduleBuilder.AssemblyBuilder; Assert.That (assemblyBuilderAdapter.AssemblyName, Is.EqualTo (c_assemblyName)); +#if NET9_0_OR_GREATER + Assert.That (assemblyBuilderAdapter.PublicKey, Is.EqualTo (expectedPublicKey)); +#else Assert.That (assemblyBuilderAdapter.PublicKey, Is.EqualTo (expectedPublicKey ?? new byte[0])); +#endif } private void CheckSaveToDiskBehavior (IModuleBuilder moduleBuilder, string assemblyDirectory) { var assemblyPath = Path.Combine (assemblyDirectory, c_assemblyFileName); var pdbPath = Path.Combine (assemblyDirectory, c_pdbFileName); - Assert.That (File.Exists (assemblyPath), Is.False); - Assert.That (File.Exists (pdbPath), Is.False); + Assert.That (File.Exists (assemblyPath), Is.False, assemblyPath); + Assert.That (File.Exists (pdbPath), Is.False, pdbPath); var result = moduleBuilder.AssemblyBuilder.SaveToDisk(); - Assert.That (File.Exists (assemblyPath), Is.True); - Assert.That (File.Exists (pdbPath), Is.True); + Assert.That (File.Exists (assemblyPath), Is.True, assemblyPath); +#if FEATURE_PDBEMIT + Assert.That (File.Exists (pdbPath), Is.True, pdbPath); +#endif Assert.That (result, Is.EqualTo (assemblyPath)); FileUtility.DeleteAndWaitForCompletion (Path.Combine (assemblyDirectory, c_assemblyFileName)); diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs index 593fcabc3..e5c1eafb0 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.Diagnostics; using System.Reflection; diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs index 92ed192a4..ec3c945b6 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs index ce48356dc..1b4492889 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs index 7d37b245e..73629de84 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs index 99deeb63d..3e06fb8ce 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs index a412cbd29..69f1358e5 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs index ce5984282..dd5e778dc 100644 --- a/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs +++ b/Development/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/Development/AssemblyTrackingCodeManager.cs b/Development/AssemblyTrackingCodeManager.cs index 6995ed4b6..c7d85ac6e 100644 --- a/Development/AssemblyTrackingCodeManager.cs +++ b/Development/AssemblyTrackingCodeManager.cs @@ -14,10 +14,11 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK || NET9_0_OR_GREATER using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; using Remotion.Development.UnitTesting; @@ -67,6 +68,7 @@ public void AddSavedAssembly (string assemblyPath) } } +#if NETFRAMEWORK public void PeVerifySavedAssemblies () { lock (_lockObject) @@ -75,6 +77,18 @@ public void PeVerifySavedAssemblies () PEVerifier.CreateDefault().VerifyPEFile (assemblyPath); } } +#elif NET9_0_OR_GREATER + public void ProcessSavedAssemblies (Action processor) + { + ArgumentUtility.CheckNotNull ("processor", processor); + + lock (_lockObject) + { + foreach (var assemblyPath in _savedAssemblies) + processor (assemblyPath); + } + } +#endif public void DeleteSavedAssemblies () { diff --git a/Development/AssemblyTrackingPipelineFactory.cs b/Development/AssemblyTrackingPipelineFactory.cs index 4527c83ad..279e2dd69 100644 --- a/Development/AssemblyTrackingPipelineFactory.cs +++ b/Development/AssemblyTrackingPipelineFactory.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK || NET9_0_OR_GREATER using System; using Remotion.TypePipe.Caching; using Remotion.TypePipe.CodeGeneration; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs index 593fcabc3..e5c1eafb0 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifier.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.Diagnostics; using System.Reflection; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs index 92ed192a4..ec3c945b6 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/DotNetSdk20PEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs index ce48356dc..1b4492889 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk6PEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs index 7d37b245e..73629de84 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk70aPEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs index 99deeb63d..3e06fb8ce 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk71PEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs index a412cbd29..69f1358e5 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk80aPEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs index ce5984282..dd5e778dc 100644 --- a/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs +++ b/IntegrationTests/App_Packages/Remotion.Development.PEVerifier.Sources.1.17.10.0/PEVerifyPathSources/WindowsSdk81aPEVerifyPathSource.cs @@ -14,7 +14,7 @@ // License for the specific language governing permissions and limitations // under the License. // -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK using System; using System.IO; using Microsoft.Win32; diff --git a/IntegrationTests/IntegrationTestBase.cs b/IntegrationTests/IntegrationTestBase.cs index 9cb331deb..b938ff5fb 100644 --- a/IntegrationTests/IntegrationTestBase.cs +++ b/IntegrationTests/IntegrationTestBase.cs @@ -93,9 +93,7 @@ public virtual void SetUp () [TearDown] public virtual void TearDown () { -#if !FEATURE_ASSEMBLYBUILDER_SAVE SkipSavingAndPeVerification(); -#endif if (_skipSavingAndVerification) return; @@ -196,7 +194,7 @@ protected string[] Flush (CustomAttributeDeclaration[] assemblyAttributes = null private static void PeVerifyAssembly (string assemblyPath) { -#if FEATURE_ASSEMBLYBUILDER_SAVE +#if NETFRAMEWORK try { PEVerifier.CreateDefault().VerifyPEFile (assemblyPath); @@ -206,6 +204,17 @@ private static void PeVerifyAssembly (string assemblyPath) Console.WriteLine (exception); throw; } +#elif NET9_0_OR_GREATER + try + { + // RM-9285 + // new ILVerify.Verifier() + } + catch (Exception exception) + { + Console.WriteLine (exception); + throw; + } #else throw new PlatformNotSupportedException ("AssemblyBuilder.Save() is not supported in .NET 5.0"); #endif diff --git a/IntegrationTests/Pipeline/ConcurrencyTest_WithMultipleGenerationThreads.cs b/IntegrationTests/Pipeline/ConcurrencyTest_WithMultipleGenerationThreads.cs index 0b53307ab..5f169b37e 100644 --- a/IntegrationTests/Pipeline/ConcurrencyTest_WithMultipleGenerationThreads.cs +++ b/IntegrationTests/Pipeline/ConcurrencyTest_WithMultipleGenerationThreads.cs @@ -126,7 +126,7 @@ public void CodeGenerationIsParallelInSeparateAssemblies_WithDegreeOfParallelism } [Test] -#if !FEATURE_ASSEMBLYBUILDER_SAVE +#if NET8_0 [Ignore ("CodeManager.FlushCodeToDisk() is not supported.")] #endif public void LoadFlushedCodeInParallel_GetTypeIDForAssembledTypeBlocks () @@ -159,7 +159,7 @@ public void LoadFlushedCodeInParallel_GetTypeIDForAssembledTypeBlocks () } [Test] -#if !FEATURE_ASSEMBLYBUILDER_SAVE +#if NET8_0 [Ignore ("CodeManager.FlushCodeToDisk() is not supported.")] #endif public void CodeManagerAPIs_FlushIsBlockedUntilAllCodeGenerationIsComplete () diff --git a/IntegrationTests/Pipeline/ConcurrencyTest_WithSingleGenerationThread.cs b/IntegrationTests/Pipeline/ConcurrencyTest_WithSingleGenerationThread.cs index 2f1e5bddc..e0b75f295 100644 --- a/IntegrationTests/Pipeline/ConcurrencyTest_WithSingleGenerationThread.cs +++ b/IntegrationTests/Pipeline/ConcurrencyTest_WithSingleGenerationThread.cs @@ -92,7 +92,7 @@ public void CodeGenerationIsSerialized () } [Test] -#if !FEATURE_ASSEMBLYBUILDER_SAVE +#if NET8_0 [Ignore ("CodeManager.FlushCodeToDisk() is not supported.")] #endif public void CodeManagerAPIs_CannotRunWhileCodeIsGenerated () diff --git a/IntegrationTests/Pipeline/FlushGeneratedCodeTest.cs b/IntegrationTests/Pipeline/FlushGeneratedCodeTest.cs index cfab064da..60376fbbd 100644 --- a/IntegrationTests/Pipeline/FlushGeneratedCodeTest.cs +++ b/IntegrationTests/Pipeline/FlushGeneratedCodeTest.cs @@ -28,7 +28,7 @@ namespace Remotion.TypePipe.IntegrationTests.Pipeline { [TestFixture] -#if !FEATURE_ASSEMBLYBUILDER_SAVE +#if NET8_0 [Ignore ("CodeManager.FlushCodeToDisk() is not supported.")] #endif public class FlushGeneratedCodeTest : IntegrationTestBase diff --git a/IntegrationTests/Pipeline/LoadFlushedCodeTest.cs b/IntegrationTests/Pipeline/LoadFlushedCodeTest.cs index 54a96f00a..506ed3256 100644 --- a/IntegrationTests/Pipeline/LoadFlushedCodeTest.cs +++ b/IntegrationTests/Pipeline/LoadFlushedCodeTest.cs @@ -27,7 +27,7 @@ namespace Remotion.TypePipe.IntegrationTests.Pipeline { [TestFixture] -#if !FEATURE_ASSEMBLYBUILDER_SAVE +#if NET8_0 [Ignore ("CodeManager.FlushCodeToDisk() is not supported.")] #endif public class LoadFlushedCodeTest : IntegrationTestBase diff --git a/IntegrationTests/Pipeline/ParticipantStateTest.cs b/IntegrationTests/Pipeline/ParticipantStateTest.cs index 452dd5410..914d34b49 100644 --- a/IntegrationTests/Pipeline/ParticipantStateTest.cs +++ b/IntegrationTests/Pipeline/ParticipantStateTest.cs @@ -23,7 +23,7 @@ namespace Remotion.TypePipe.IntegrationTests.Pipeline { [TestFixture] -#if !FEATURE_ASSEMBLYBUILDER_SAVE +#if NET8_0 [Ignore ("CodeManager.FlushCodeToDisk() is not supported.")] #endif public class ParticipantStateTest : IntegrationTestBase diff --git a/Shared.build.props b/Shared.build.props index 2a3d53a95..7839aa56f 100644 --- a/Shared.build.props +++ b/Shared.build.props @@ -35,7 +35,7 @@ True net8.0;net9.0;net462 $(DefineConstants);TypePipe - $(DefineConstants);FEATURE_ASSEMBLYBUILDER_SAVE;FEATURE_REMOTING;FEATURE_PDBEMIT;FEATURE_STRONGNAMESIGNING + $(DefineConstants);FEATURE_REMOTING;FEATURE_PDBEMIT;FEATURE_STRONGNAMESIGNING @@ -53,7 +53,7 @@ False net8.0;net9.0;net462 $(DefineConstants) - $(DefineConstants);FEATURE_ASSEMBLYBUILDER_SAVE;FEATURE_STRONGNAMESIGNING + $(DefineConstants);FEATURE_PDBEMIT;FEATURE_STRONGNAMESIGNING From b7adeb1947df3dd5c63ada3e068ed7ce45916274 Mon Sep 17 00:00:00 2001 From: Michael Ketting Date: Mon, 4 Nov 2024 15:24:40 +0100 Subject: [PATCH 3/4] RMTP-120 Add clean-up of persisted assembly file --- .../ReflectionEmit/ModuleBuilderFactoryTest.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs b/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs index 35bc0e680..b435e5f5f 100644 --- a/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs +++ b/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs @@ -47,6 +47,15 @@ public void SetUp () _currentDirectory = Environment.CurrentDirectory; } + + [TearDown] + public void TearDown () + { + var assemblyPath = Path.Combine (_currentDirectory, c_assemblyFileName); + if (File.Exists (assemblyPath)) + File.Delete (assemblyPath); + } + [Test] public void CreateModuleBuilder () { From e00dacd0b31af01964f3b8051e6f07c8521f426b Mon Sep 17 00:00:00 2001 From: Michael Ketting Date: Mon, 4 Nov 2024 19:27:16 +0100 Subject: [PATCH 4/4] RMTP-120 Add path --- .../ModuleBuilderFactoryTest.cs | 2 +- .../Abstractions/AssemblyBuilderAdapter.cs | 28 +++++++++++++++++-- .../Abstractions/ModuleBuilderAdapter.cs | 9 ++++-- .../ReflectionEmit/ModuleBuilderFactory.cs | 6 +++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs b/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs index b435e5f5f..2616e5535 100644 --- a/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs +++ b/Core.UnitTests/CodeGeneration/ReflectionEmit/ModuleBuilderFactoryTest.cs @@ -71,7 +71,7 @@ public void CreateModuleBuilder () public void CreateModuleBuilder_AppliesTypePipeAssemblyAttribute () { var assemblyName = c_assemblyName + Guid.NewGuid(); - _factory.CreateModuleBuilder (assemblyName, assemblyDirectoryOrNull: null, strongNamed: false, keyFilePathOrNull: null); + var moduleBuilder = _factory.CreateModuleBuilder (assemblyName, assemblyDirectoryOrNull: null, strongNamed: false, keyFilePathOrNull: null); var assembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(a => a.GetName().Name == assemblyName); Assert.That (assembly, Is.Not.Null); diff --git a/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs b/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs index e56cec931..df5b270ea 100644 --- a/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs +++ b/Core/CodeGeneration/ReflectionEmit/Abstractions/AssemblyBuilderAdapter.cs @@ -15,6 +15,7 @@ // under the License. // using System; +using System.IO; using System.Reflection.Emit; using Remotion.Utilities; @@ -33,22 +34,29 @@ public class AssemblyBuilderAdapter : BuilderAdapterBase, IAssemblyBuilder { #if NET9_0_OR_GREATER private readonly PersistedAssemblyBuilder _assemblyBuilder; + private readonly string _assemblyDirectory; #else private readonly AssemblyBuilder _assemblyBuilder; #endif private readonly ModuleBuilder _moduleBuilder; #if NET9_0_OR_GREATER - public AssemblyBuilderAdapter (PersistedAssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + public AssemblyBuilderAdapter (PersistedAssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder, string assemblyDirectory) #else public AssemblyBuilderAdapter (AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) #endif : base (ArgumentUtility.CheckNotNull ("assemblyBuilder", assemblyBuilder).SetCustomAttribute) { ArgumentUtility.CheckNotNull ("moduleBuilder", moduleBuilder); +#if NET9_0_OR_GREATER + ArgumentUtility.CheckNotNullOrEmpty ("assemblyDirectory", assemblyDirectory); +#endif _assemblyBuilder = assemblyBuilder; _moduleBuilder = moduleBuilder; +#if NET9_0_OR_GREATER + _assemblyDirectory = assemblyDirectory; +#endif } public string AssemblyName @@ -61,14 +69,30 @@ public byte[] PublicKey get { return _assemblyBuilder.GetName ().GetPublicKey (); } } +#if NET9_0_OR_GREATER + public string AssemblyDirectory + { + get { return _assemblyDirectory; } + } +#endif + public string SaveToDisk () { -#if NETFRAMEWORK || NET9_0_OR_GREATER +#if NETFRAMEWORK // Scope name is the module name or file name, i.e., assembly name + '.dll'. _assemblyBuilder.Save (_moduleBuilder.ScopeName); // This is the absolute path to the module, which is also the assembly file path for single-module assemblies. return _moduleBuilder.FullyQualifiedName; +#elif NET9_0_OR_GREATER + // Scope name is the module name or file name, i.e., assembly name + '.dll'. + var modulePath = Path.Combine (_assemblyDirectory, _moduleBuilder.ScopeName); + using (var stream = new FileStream (modulePath, FileMode.Create, FileAccess.Write, FileShare.Read)) + { + _assemblyBuilder.Save (stream); + } + + return modulePath; #else throw new PlatformNotSupportedException ("Assembly persistence is not supported."); #endif diff --git a/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs b/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs index 4ff0c9030..cd3e539ac 100644 --- a/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs +++ b/Core/CodeGeneration/ReflectionEmit/Abstractions/ModuleBuilderAdapter.cs @@ -39,10 +39,15 @@ public IAssemblyBuilder AssemblyBuilder get { return _assemblyBuilder; } } +#if NET9_0_OR_GREATER + public ModuleBuilderAdapter (ModuleBuilder moduleBuilder, string assemblyDirectory) +#else public ModuleBuilderAdapter (ModuleBuilder moduleBuilder) +#endif : base (ArgumentUtility.CheckNotNull ("moduleBuilder", moduleBuilder).SetCustomAttribute) { #if NET9_0_OR_GREATER + ArgumentUtility.CheckNotNullOrEmpty ("assemblyDirectory", assemblyDirectory); Assertion.IsTrue (moduleBuilder.Assembly is PersistedAssemblyBuilder); #else Assertion.IsTrue (moduleBuilder.Assembly is AssemblyBuilder); @@ -50,9 +55,9 @@ public ModuleBuilderAdapter (ModuleBuilder moduleBuilder) _moduleBuilder = moduleBuilder; #if NET9_0_OR_GREATER - _assemblyBuilder = new AssemblyBuilderAdapter ((PersistedAssemblyBuilder) moduleBuilder.Assembly, moduleBuilder); + _assemblyBuilder = new AssemblyBuilderAdapter ((PersistedAssemblyBuilder) moduleBuilder.Assembly, moduleBuilder, assemblyDirectory); #else - _assemblyBuilder = new AssemblyBuilderAdapter (((AssemblyBuilder) moduleBuilder.Assembly), moduleBuilder); + _assemblyBuilder = new AssemblyBuilderAdapter ((AssemblyBuilder) moduleBuilder.Assembly, moduleBuilder); #endif } diff --git a/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs b/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs index 7a15c94da..7c6bf745c 100644 --- a/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs +++ b/Core/CodeGeneration/ReflectionEmit/ModuleBuilderFactory.cs @@ -94,8 +94,12 @@ public IModuleBuilder CreateModuleBuilder (string assemblyName, string assemblyD var moduleBuilder = assemblyBuilder.DefineDynamicModule (moduleName); #endif +#if NET9_0_OR_GREATER + var assmeblyDirectory = assemblyDirectoryOrNull ?? Environment.CurrentDirectory; + var moduleBuilderAdapter = new ModuleBuilderAdapter (moduleBuilder, assmeblyDirectory); +#else var moduleBuilderAdapter = new ModuleBuilderAdapter (moduleBuilder); - +#endif var typePipeAttribute = new CustomAttributeDeclaration (s_typePipeAssemblyAttributeCtor, new object[] { _participantConfigurationID }); moduleBuilderAdapter.AssemblyBuilder.SetCustomAttribute (typePipeAttribute);