diff --git a/src/Compilers/CSharp/Test/Emit/Attributes/InternalsVisibleToAndStrongNameTests.cs b/src/Compilers/CSharp/Test/Emit/Attributes/InternalsVisibleToAndStrongNameTests.cs index 339e1405da1b4aebc9fba4a9c5d834609809f3eb..737fdc4cf5c1f184768e1fc7abef9e30f2b6e725 100644 --- a/src/Compilers/CSharp/Test/Emit/Attributes/InternalsVisibleToAndStrongNameTests.cs +++ b/src/Compilers/CSharp/Test/Emit/Attributes/InternalsVisibleToAndStrongNameTests.cs @@ -1650,8 +1650,8 @@ internal void Foo() } } - [Fact(Skip = "Bug 399")] - [WorkItem(399, "GitHub")] + [Fact] + [WorkItem(399, "https://github.com/dotnet/roslyn/issues/399")] public void Bug399() { // The referenced assembly Signed.dll from the repro steps diff --git a/src/Compilers/Core/Portable/MetadataReader/PEModule.cs b/src/Compilers/Core/Portable/MetadataReader/PEModule.cs index a7407eae5853d07fa94b0d5eb0eabcb49890b4a4..f16e6a8d644672e3174f740919b10529f9bdcf4f 100644 --- a/src/Compilers/Core/Portable/MetadataReader/PEModule.cs +++ b/src/Compilers/Core/Portable/MetadataReader/PEModule.cs @@ -474,32 +474,49 @@ internal AssemblyIdentity ReadAssemblyIdentityOrThrow() throw new BadImageFormatException(string.Format(CodeAnalysisResources.InvalidAssemblyName, nameStr)); } - string cultureName = (!culture.IsNil) ? reader.GetString(culture) : null; + string cultureName = culture.IsNil ? null : reader.GetString(culture); if (cultureName != null && !MetadataHelpers.IsValidMetadataIdentifier(cultureName)) { throw new BadImageFormatException(string.Format(CodeAnalysisResources.InvalidCultureName, cultureName)); } - var hasPublicKey = (flags & AssemblyFlags.PublicKey) != 0; - var publicKeyOrToken = !publicKey.IsNil ? reader.GetBlobBytes(publicKey).AsImmutableOrNull() : default(ImmutableArray); - if (hasPublicKey) + ImmutableArray publicKeyOrToken = reader.GetBlobContent(publicKey); + bool hasPublicKey; + + if (isReference) { - if (!MetadataHelpers.IsValidPublicKey(publicKeyOrToken)) + hasPublicKey = (flags & AssemblyFlags.PublicKey) != 0; + if (hasPublicKey) { - throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKey); + if (!MetadataHelpers.IsValidPublicKey(publicKeyOrToken)) + { + throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKey); + } + } + else + { + if (!publicKeyOrToken.IsEmpty && + publicKeyOrToken.Length != AssemblyIdentity.PublicKeyTokenSize) + { + throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKeyToken); + } } } - else if (isReference) + else { - if (!publicKeyOrToken.IsDefaultOrEmpty && publicKeyOrToken.Length != AssemblyIdentity.PublicKeyTokenSize) + // Assembly definitions never contain a public key token, they only can have a full key or nothing, + // so the flag AssemblyFlags.PublicKey does not make sense for them and is ignored. + // See Ecma-335, Partition II Metadata, 22.2 "Assembly : 0x20". + // This also corresponds to the behavior of the native C# compiler and sn.exe tool. + hasPublicKey = !publicKeyOrToken.IsEmpty; + if (hasPublicKey && !MetadataHelpers.IsValidPublicKey(publicKeyOrToken)) { - throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKeyToken); + throw new BadImageFormatException(CodeAnalysisResources.InvalidPublicKey); } } - else + + if (publicKeyOrToken.IsEmpty) { - // Assembly definitions do not contain public key tokens, but they may contain public key - // data without being marked as strong name signed (e.g. delay-signed assemblies). publicKeyOrToken = default(ImmutableArray); } diff --git a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/PseudoVariableTests.cs b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/PseudoVariableTests.cs index e2cde3732558f3f226e0ccafa485a6efdcbeba00..bed7c545c408c300a619ade1431b2b8049b01247 100644 --- a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/PseudoVariableTests.cs +++ b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/PseudoVariableTests.cs @@ -1050,8 +1050,8 @@ static void M() context.CompileExpression( // typeof(Exception), typeof(A>), typeof(B[]>) InspectionContextFactory.Empty.Add("$exception", "System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"). - Add("1", "A`1[[B`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], 397300B0-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null]], 397300B0-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=null"). - Add("2", "B`1[[A`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][], 397300B0-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=null]], 397300B0-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null"), + Add("1", "A`1[[B`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], 397300B0-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null]], 397300B0-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=1f8a32457d187bf3"). + Add("2", "B`1[[A`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][], 397300B0-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=1f8a32457d187bf3]], 397300B0-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null"), "(object)$exception ?? (object)$1 ?? $2", DkmEvaluationFlags.TreatAsExpression, DiagnosticFormatter.Instance, diff --git a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/PseudoVariableTests.vb b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/PseudoVariableTests.vb index 23629c2a45264bf3aa73e42c256dd9bbd3d7dffa..25f56c54f98df90f0410f73c534dbbb91a10b11b 100644 --- a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/PseudoVariableTests.vb +++ b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/PseudoVariableTests.vb @@ -859,8 +859,8 @@ End Class" ' GetType(Exception), GetType(A(Of B(Of Object))), GetType(B(Of A(Of Object)())) context.CompileExpression( InspectionContextFactory.Empty.Add("$exception", "System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"). - Add("1", "A`1[[B`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], 397300B1-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null]], 397300B1-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=null"). - Add("2", "B`1[[A`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][], 397300B1-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=null]], 397300B1-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null"), + Add("1", "A`1[[B`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], 397300B1-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null]], 397300B1-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=1f8a32457d187bf3"). + Add("2", "B`1[[A`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][], 397300B1-A, Version=2.1.2.1, Culture=neutral, PublicKeyToken=1f8a32457d187bf3]], 397300B1-B, Version=1.2.2.2, Culture=neutral, PublicKeyToken=null"), "If(If($exception, $1), $2)", DkmEvaluationFlags.TreatAsExpression, DiagnosticFormatter.Instance,