Skip to content

Commit 745baab

Browse files
Using dotnet 9's save assembly api for debugging DI IL emit (#98234)
* using dotnet 9 save assembly api for debugging DI IL emit * Update src/libraries/Microsoft.Extensions.DependencyInjection/src/Microsoft.Extensions.DependencyInjection.csproj Co-authored-by: Austin Wise <AustinWise@gmail.com> --------- Co-authored-by: Austin Wise <AustinWise@gmail.com>
1 parent fae6720 commit 745baab

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

src/libraries/Microsoft.Extensions.DependencyInjection/src/Microsoft.Extensions.DependencyInjection.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFrameworks>$(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.1;netstandard2.0;$(NetFrameworkMinimum)</TargetFrameworks>
@@ -14,8 +14,8 @@
1414
<PropertyGroup>
1515
<ILEmitBackend Condition="'$(TargetFramework)' != 'netstandard2.0'">true</ILEmitBackend>
1616
<DefineConstants Condition="'$(ILEmitBackend)' == 'true'">$(DefineConstants);IL_EMIT</DefineConstants>
17-
<DefineConstants Condition="$([MSBuild]::GetTargetFrameworkIdentifier('$(TargetFramework)')) == '.NETFramework' and
18-
'$(ILEmitBackendSaveAssemblies)' == 'true'">$(DefineConstants);SAVE_ASSEMBLIES</DefineConstants>
17+
<DefineConstants Condition="($([MSBuild]::GetTargetFrameworkIdentifier('$(TargetFramework)')) == '.NETFramework' or $([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0'))) and
18+
'$(ILEmitBackendSaveAssemblies)' == 'true'">$(DefineConstants);SAVE_ASSEMBLIES</DefineConstants>
1919
</PropertyGroup>
2020

2121
<ItemGroup>

src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/ILEmit/ILEmitResolverBuilder.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,13 @@ private GeneratedMethod BuildTypeNoCache(ServiceCallSite callSite)
104104
var assemblyName = "Test" + DateTime.Now.Ticks;
105105
var fileName = assemblyName + ".dll";
106106

107+
#if NETFRAMEWORK
107108
var assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.RunAndSave);
108109
var module = assembly.DefineDynamicModule(assemblyName, fileName);
110+
#else
111+
var assembly = AssemblyBuilder.DefinePersistedAssembly(new AssemblyName(assemblyName), typeof(object).Assembly);
112+
var module = assembly.DefineDynamicModule(assemblyName);
113+
#endif
109114
var type = module.DefineType(callSite.ServiceType.Name + "Resolver");
110115

111116
var method = type.DefineMethod(
@@ -114,7 +119,6 @@ private GeneratedMethod BuildTypeNoCache(ServiceCallSite callSite)
114119

115120
GenerateMethodBody(callSite, method.GetILGenerator());
116121
type.CreateTypeInfo();
117-
// Assembly.Save is only available in .NET Framework (https://github.com/dotnet/runtime/issues/15704)
118122
assembly.Save(fileName);
119123
#endif
120124
DependencyInjectionEventSource.Log.DynamicMethodBuilt(_rootScope.RootProvider, callSite.ServiceType, ilGenerator.ILOffset);
@@ -179,7 +183,7 @@ private GeneratedMethod BuildTypeNoCache(ServiceCallSite callSite)
179183
AddConstant(argument, generatedMethod.Lambda);
180184
// ProviderScope
181185
argument.Generator.Emit(OpCodes.Ldarg_1);
182-
argument.Generator.Emit(OpCodes.Call, generatedMethod.Lambda.GetType().GetMethod("Invoke"));
186+
argument.Generator.Emit(OpCodes.Call, generatedMethod.Lambda.GetType().GetMethod("Invoke")!);
183187
#else
184188
AddConstant(argument, generatedMethod.Context);
185189
// ProviderScope

0 commit comments

Comments
 (0)