提交 66603086 编写于 作者: J Julien Couvreur 提交者: Nat Ayewah

Silently treat IncludePrivateMembers as true when emitting regular assemblies (#21359)

上级 1e85b99e
......@@ -1595,6 +1595,36 @@ public class PublicClass
"System.Diagnostics.DebuggableAttribute" },
compWithReal.SourceModule.GetReferencedAssemblySymbols().Last().GetAttributes().Select(a => a.AttributeClass.ToTestDisplayString()));
// Verify metadata (types, members, attributes) of the regular assembly with IncludePrivateMembers accidentally set to false.
// Note this can happen because of binary clients compiled against old EmitOptions ctor which had IncludePrivateMembers=false by default.
// In this case, IncludePrivateMembers is silently set to true when emitting
// See https://github.com/dotnet/roslyn/issues/20873
var emitRegularWithoutPrivateMembers = EmitOptions.Default.WithIncludePrivateMembers(false);
CompileAndVerify(comp, emitOptions: emitRegularWithoutPrivateMembers, verify: true);
var realImage2 = comp.EmitToImageReference(emitRegularWithoutPrivateMembers);
var compWithReal2 = CreateCompilation("", references: new[] { MscorlibRef, realImage2 },
options: TestOptions.DebugDll.WithMetadataImportOptions(MetadataImportOptions.All));
AssertEx.Equal(
new[] { "<Module>", "<>f__AnonymousType0<<anonymous>j__TPar>", "PublicClass" },
compWithReal2.SourceModule.GetReferencedAssemblySymbols().Last().GlobalNamespace.GetMembers().Select(m => m.ToDisplayString()));
AssertEx.Equal(
new[] { "void PublicClass.PublicMethod()", "void PublicClass.PrivateMethod()",
"void PublicClass.ProtectedMethod()", "void PublicClass.InternalMethod()",
"void PublicClass.PublicEvent.add", "void PublicClass.PublicEvent.remove",
"void PublicClass.InternalEvent.add", "void PublicClass.InternalEvent.remove",
"PublicClass..ctor()",
"event System.Action PublicClass.PublicEvent", "event System.Action PublicClass.InternalEvent" },
compWithReal2.GetMember<NamedTypeSymbol>("PublicClass").GetMembers()
.Select(m => m.ToTestDisplayString()));
AssertEx.Equal(
new[] { "System.Runtime.CompilerServices.CompilationRelaxationsAttribute",
"System.Runtime.CompilerServices.RuntimeCompatibilityAttribute",
"System.Diagnostics.DebuggableAttribute" },
compWithReal2.SourceModule.GetReferencedAssemblySymbols().Last().GetAttributes().Select(a => a.AttributeClass.ToTestDisplayString()));
// verify metadata (types, members, attributes) of the metadata-only assembly
var emitMetadataOnly = EmitOptions.Default.WithEmitMetadataOnly(true);
CompileAndVerify(comp, emitOptions: emitMetadataOnly, verify: true);
......@@ -1950,15 +1980,16 @@ public void IncludePrivateMembers_DisallowMetadataPeStream()
}
[Fact]
public void MustIncludePrivateMembersUnlessRefAssembly()
[WorkItem(20873, "https://github.com/dotnet/roslyn/issues/20873")]
public void IncludePrivateMembersSilentlyAssumedTrueWhenEmittingRegular()
{
CSharpCompilation comp = CreateCompilation("", references: new[] { MscorlibRef },
options: TestOptions.DebugDll.WithDeterministic(true));
using (var output = new MemoryStream())
{
Assert.Throws<ArgumentException>(() => comp.Emit(output,
options: EmitOptions.Default.WithIncludePrivateMembers(false)));
// no exception
_ = comp.Emit(output, options: EmitOptions.Default.WithIncludePrivateMembers(false));
}
}
......
......@@ -2087,9 +2087,10 @@ internal void EnsureAnonymousTypeTemplates(CancellationToken cancellationToken)
throw new ArgumentException(CodeAnalysisResources.IncludingPrivateMembersUnexpectedWhenEmittingToMetadataPeStream, nameof(metadataPEStream));
}
if (metadataPEStream == null && options?.EmitMetadataOnly == false && options?.IncludePrivateMembers == false)
if (metadataPEStream == null && options?.EmitMetadataOnly == false)
{
throw new ArgumentException(CodeAnalysisResources.MustIncludePrivateMembersUnlessRefAssembly, nameof(options.IncludePrivateMembers));
// EmitOptions used to default to IncludePrivateMembers=false, so to preserve binary compatibility we silently correct that unless emitting regular assemblies
options = options.WithIncludePrivateMembers(true);
}
if (options?.DebugInformationFormat == DebugInformationFormat.Embedded &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册