InternalsVisibleToAndStrongNameTests.cs 75.8 KB
Newer Older
1
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.
P
Pilchie 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

using System;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Collections;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Microsoft.CodeAnalysis.Emit;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Roslyn.Utilities;
using Xunit;

public class InternalsVisibleToAndStrongNameTests : CSharpTestBase
{
    #region Helpers

    public InternalsVisibleToAndStrongNameTests()
    {
        SigningTestHelpers.InstallKey();
    }

29 30 31 32
    private static readonly string s_keyPairFile = SigningTestHelpers.KeyPairFile;
    private static readonly string s_publicKeyFile = SigningTestHelpers.PublicKeyFile;
    private static readonly ImmutableArray<byte> s_publicKey = SigningTestHelpers.PublicKey;
    private static readonly DesktopStrongNameProvider s_defaultProvider = new SigningTestHelpers.VirtualizedStrongNameProvider(ImmutableArray.Create<string>());
P
Pilchie 已提交
33 34 35 36 37 38 39 40 41 42

    private static DesktopStrongNameProvider GetProviderWithPath(string keyFilePath)
    {
        return new SigningTestHelpers.VirtualizedStrongNameProvider(ImmutableArray.Create(keyFilePath));
    }

    #endregion

    #region Naming Tests

43
    [Fact, WorkItem(529419, "DevDiv")]
P
Pilchie 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    public void AssemblyKeyFileAttributeNotExistFile()
    {
        string source = @"
using System;
using System.Reflection;

[assembly: AssemblyKeyFile(""MyKey.snk"")]
[assembly: AssemblyKeyName(""Key Name"")]

public class Test
{
    public static void Main()
    {
        Console.Write(""Hello World!"");
    }
}
";
        // Dev11 RC gives error now (CS1548) + two warnings
        // Diagnostic(ErrorCode.WRN_UseSwitchInsteadOfAttribute).WithArguments(@"/keyfile", "AssemblyKeyFile"),
        // Diagnostic(ErrorCode.WRN_UseSwitchInsteadOfAttribute).WithArguments(@"/keycontainer", "AssemblyKeyName")
64
        var c = CreateCompilationWithMscorlib(source,
P
Pilchie 已提交
65
            references: new[] { SystemRef },
66
            options: TestOptions.ReleaseDll.WithStrongNameProvider(new DesktopStrongNameProvider()));
P
Pilchie 已提交
67 68

        c.VerifyDiagnostics(
69
            Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments("MyKey.snk", CodeAnalysisResources.FileNotFound));
P
Pilchie 已提交
70 71 72 73 74
    }

    [Fact]
    public void PubKeyFromKeyFileAttribute()
    {
75
        var x = s_keyPairFile;
P
Pilchie 已提交
76 77
        string s = String.Format("{0}{1}{2}", @"[assembly: System.Reflection.AssemblyKeyFile(@""", x, @""")] public class C {}");

78
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
79
        other.VerifyDiagnostics();
80
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, other.Assembly.Identity.PublicKey));
P
Pilchie 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

        CompileAndVerify(other, symbolValidator: (ModuleSymbol m) =>
            {
                bool haveAttribute = false;

                foreach (var attrData in m.ContainingAssembly.GetAttributes())
                {
                    if (attrData.IsTargetAttribute(m.ContainingAssembly, AttributeDescription.AssemblyKeyFileAttribute))
                    {
                        haveAttribute = true;
                        break;
                    }
                }

                Assert.True(haveAttribute);
96
            }, emitOptions: TestEmitters.CCI);
P
Pilchie 已提交
97 98 99 100 101
    }

    [Fact]
    public void PubKeyFromKeyFileAttribute_AssemblyKeyFileResolver()
    {
102 103
        string keyFileDir = Path.GetDirectoryName(s_keyPairFile);
        string keyFileName = Path.GetFileName(s_keyPairFile);
P
Pilchie 已提交
104 105 106

        string s = string.Format("{0}{1}{2}", @"[assembly: System.Reflection.AssemblyKeyFile(@""", keyFileName, @""")] public class C {}");
        var syntaxTree = Parse(s, @"IVTAndStrongNameTests\AnotherTempDir\temp.cs");
107

P
Pilchie 已提交
108
        // verify failure with default assembly key file resolver
109
        var comp = CreateCompilationWithMscorlib(syntaxTree, options: TestOptions.ReleaseDll);
P
Pilchie 已提交
110 111 112 113 114 115 116 117 118 119
        comp.VerifyDiagnostics(
            Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments(keyFileName, "Assembly signing not supported."));

        Assert.True(comp.Assembly.Identity.PublicKey.IsEmpty);

        // verify success with custom assembly key file resolver with keyFileDir added to search paths
        comp = CSharpCompilation.Create(
            GetUniqueName(),
            new[] { syntaxTree },
            new[] { MscorlibRef },
120
            TestOptions.ReleaseDll.WithStrongNameProvider(GetProviderWithPath(keyFileDir)));
P
Pilchie 已提交
121 122 123

        comp.VerifyDiagnostics();

124
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, comp.Assembly.Identity.PublicKey));
P
Pilchie 已提交
125 126 127 128 129
    }

    [Fact]
    public void PubKeyFromKeyFileAttribute_AssemblyKeyFileResolver_RelativeToCurrentParent()
    {
130 131
        string keyFileDir = Path.GetDirectoryName(s_keyPairFile);
        string keyFileName = Path.GetFileName(s_keyPairFile);
P
Pilchie 已提交
132 133 134 135 136

        string s = String.Format("{0}{1}{2}", @"[assembly: System.Reflection.AssemblyKeyFile(@""..\", keyFileName, @""")] public class C {}");
        var syntaxTree = Parse(s, @"IVTAndStrongNameTests\AnotherTempDir\temp.cs");

        // verify failure with default assembly key file resolver
137
        var comp = CreateCompilationWithMscorlib(syntaxTree, options: TestOptions.ReleaseDll);
P
Pilchie 已提交
138 139 140 141 142 143 144 145 146 147 148
        comp.VerifyDiagnostics(
            // error CS7027: Error extracting public key from file '..\KeyPairFile.snk' -- File not found.
            Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments(@"..\" + keyFileName, "Assembly signing not supported."));

        Assert.True(comp.Assembly.Identity.PublicKey.IsEmpty);

        // verify success with custom assembly key file resolver with keyFileDir\TempSubDir added to search paths
        comp = CSharpCompilation.Create(
            GetUniqueName(),
            new[] { syntaxTree },
            new[] { MscorlibRef },
149
            TestOptions.ReleaseDll.WithStrongNameProvider(GetProviderWithPath(PathUtilities.CombineAbsoluteAndRelativePaths(keyFileDir, @"TempSubDir\"))));
P
Pilchie 已提交
150 151

        Assert.Empty(comp.GetDiagnostics());
152
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, comp.Assembly.Identity.PublicKey));
P
Pilchie 已提交
153
    }
154

P
Pilchie 已提交
155 156 157
    [Fact]
    public void PubKeyFromKeyContainerAttribute()
    {
158
        var x = s_keyPairFile;
P
Pilchie 已提交
159 160
        string s = @"[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")] public class C {}";

161
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
162
        other.VerifyDiagnostics();
163
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, other.Assembly.Identity.PublicKey));
P
Pilchie 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

        CompileAndVerify(other, symbolValidator: (ModuleSymbol m) =>
        {
            bool haveAttribute = false;

            foreach (var attrData in m.ContainingAssembly.GetAttributes())
            {
                if (attrData.IsTargetAttribute(m.ContainingAssembly, AttributeDescription.AssemblyKeyNameAttribute))
                {
                    haveAttribute = true;
                    break;
                }
            }

            Assert.True(haveAttribute);
179
        }, emitOptions: TestEmitters.CCI);
P
Pilchie 已提交
180 181 182 183 184 185
    }

    [Fact]
    public void PubKeyFromKeyFileOptions()
    {
        string s = "public class C {}";
186
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
187 188

        other.VerifyDiagnostics();
189
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, other.Assembly.Identity.PublicKey));
P
Pilchie 已提交
190 191 192 193 194
    }

    [Fact]
    public void PubKeyFromKeyFileOptions_ReferenceResolver()
    {
195 196
        string keyFileDir = Path.GetDirectoryName(s_keyPairFile);
        string keyFileName = Path.GetFileName(s_keyPairFile);
P
Pilchie 已提交
197 198 199 200 201

        string s = "public class C {}";
        var syntaxTree = Parse(s, @"IVTAndStrongNameTests\AnotherTempDir\temp.cs");

        // verify failure with default resolver
202
        var comp = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithCryptoKeyFile(keyFileName).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
203 204 205

        comp.VerifyDiagnostics(
            // error CS7027: Error extracting public key from file 'KeyPairFile.snk' -- File not found.
206
            Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments(keyFileName, CodeAnalysisResources.FileNotFound));
207

P
Pilchie 已提交
208 209 210 211 212 213 214
        Assert.True(comp.Assembly.Identity.PublicKey.IsEmpty);

        // verify success with custom assembly key file resolver with keyFileDir added to search paths
        comp = CSharpCompilation.Create(
            GetUniqueName(),
            new[] { syntaxTree },
            new[] { MscorlibRef },
215
            TestOptions.ReleaseDll.WithCryptoKeyFile(keyFileName).WithStrongNameProvider(GetProviderWithPath(keyFileDir)));
P
Pilchie 已提交
216 217

        Assert.Empty(comp.GetDiagnostics());
218
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, comp.Assembly.Identity.PublicKey));
P
Pilchie 已提交
219 220 221 222 223 224
    }

    [Fact]
    public void PubKeyFromKeyFileOptionsJustPublicKey()
    {
        string s = "public class C {}";
225 226
        var other = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithDelaySign(true).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
227
        other.VerifyDiagnostics();
P
pgavlin 已提交
228
        Assert.True(ByteSequenceComparer.Equals(TestResources.SymbolsTests.General.snPublicKey.AsImmutableOrNull(), other.Assembly.Identity.PublicKey));
P
Pilchie 已提交
229 230 231 232 233
    }

    [Fact]
    public void PubKeyFromKeyFileOptionsJustPublicKey_ReferenceResolver()
    {
234 235
        string publicKeyFileDir = Path.GetDirectoryName(s_publicKeyFile);
        string publicKeyFileName = Path.GetFileName(s_publicKeyFile);
P
Pilchie 已提交
236 237 238 239 240

        string s = "public class C {}";
        var syntaxTree = Parse(s, @"IVTAndStrongNameTests\AnotherTempDir\temp.cs");

        // verify failure with default resolver
241 242
        var comp = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(publicKeyFileName).WithDelaySign(true).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
243 244 245

        comp.VerifyDiagnostics(
            // error CS7027: Error extracting public key from file 'PublicKeyFile.snk' -- File not found.
246
            Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments(publicKeyFileName, CodeAnalysisResources.FileNotFound),
P
Pilchie 已提交
247 248 249 250 251 252 253 254 255 256 257
            // warning CS7033: Delay signing was specified and requires a public key, but no public key was specified
            Diagnostic(ErrorCode.WRN_DelaySignButNoKey)
        );

        Assert.True(comp.Assembly.Identity.PublicKey.IsEmpty);

        // verify success with custom assembly key file resolver with publicKeyFileDir added to search paths
        comp = CSharpCompilation.Create(
            GetUniqueName(),
            new[] { syntaxTree },
            new[] { MscorlibRef },
258
            TestOptions.ReleaseDll.WithCryptoKeyFile(publicKeyFileName).WithDelaySign(true).WithStrongNameProvider(GetProviderWithPath(publicKeyFileDir)));
P
Pilchie 已提交
259
        Assert.Empty(comp.GetDiagnostics());
260
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, comp.Assembly.Identity.PublicKey));
P
Pilchie 已提交
261 262 263 264 265 266
    }

    [Fact]
    public void PubKeyFileNotFoundOptions()
    {
        string s = "public class C {}";
267 268
        var other = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseDll.WithCryptoKeyFile("foo").WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
269 270

        other.VerifyDiagnostics(
271
            Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments("foo", CodeAnalysisResources.FileNotFound));
P
Pilchie 已提交
272 273 274 275 276 277 278 279 280 281

        Assert.True(other.Assembly.Identity.PublicKey.IsEmpty);
    }

    [Fact]
    public void PubKeyFileBogusOptions()
    {
        var tempFile = Temp.CreateFile().WriteAllBytes(new byte[] { 1, 2, 3, 4 });
        string s = "public class C {}";

282
        CSharpCompilation other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithCryptoKeyFile(tempFile.Path));
P
Pilchie 已提交
283 284 285 286 287 288 289 290 291 292

        //TODO check for specific error
        Assert.NotEmpty(other.GetDiagnostics());
        Assert.True(other.Assembly.Identity.PublicKey.IsEmpty);
    }

    [Fact]
    public void PubKeyContainerBogusOptions()
    {
        string s = "public class C {}";
293 294
        var other = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseDll.WithCryptoKeyContainer("foo").WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
295

296 297 298 299 300 301 302 303
        // error CS7028: Error signing output with public key from container 'foo' -- Keyset does not exist (Exception from HRESULT: 0x80090016)
        var err = other.GetDiagnostics().Single();

        Assert.Equal((int)ErrorCode.ERR_PublicKeyContainerFailure, err.Code);
        Assert.Equal(2, err.Arguments.Count);
        Assert.Equal("foo", err.Arguments[0]);
        Assert.True(((string)err.Arguments[1]).EndsWith(" HRESULT: 0x80090016)"));

P
Pilchie 已提交
304 305 306 307 308 309 310 311
        Assert.True(other.Assembly.Identity.PublicKey.IsEmpty);
    }

    [Fact]
    public void KeyFileAttributeOptionConflict()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyFile(""bogus"")] public class C {}";

312 313
        var other = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
314 315

        other.VerifyDiagnostics(Diagnostic(ErrorCode.WRN_CmdOptionConflictsSource).WithArguments("CryptoKeyFile", "System.Reflection.AssemblyKeyFileAttribute"));
316
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, other.Assembly.Identity.PublicKey));
P
Pilchie 已提交
317 318 319 320 321 322 323
    }

    [Fact]
    public void KeyContainerAttributeOptionConflict()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyName(""bogus"")] public class C {}";

324 325
        var other = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseDll.WithCryptoKeyContainer("RoslynTestContainer").WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
326 327

        other.VerifyDiagnostics(Diagnostic(ErrorCode.WRN_CmdOptionConflictsSource).WithArguments("CryptoKeyContainer", "System.Reflection.AssemblyKeyNameAttribute"));
328
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, other.Assembly.Identity.PublicKey));
P
Pilchie 已提交
329 330 331 332 333 334 335
    }

    [Fact]
    public void KeyFileAttributeEmpty()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyFile("""")] public class C {}";

336
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
337 338 339 340 341 342 343 344 345
        Assert.True(other.Assembly.Identity.PublicKey.IsEmpty);
        other.VerifyDiagnostics();
    }

    [Fact]
    public void KeyContainerEmpty()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyName("""")] public class C {}";

346
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
347 348 349 350 351 352 353 354 355 356 357 358 359 360
        Assert.True(other.Assembly.Identity.PublicKey.IsEmpty);
        other.VerifyDiagnostics();
    }

    #endregion

    #region IVT Access Checking

    [Fact]
    public void IVTBasicCompilation()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""WantsIVTAccess"")]
            public class C { internal void Foo() {} }";

361
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
362 363 364 365 366 367 368 369 370 371 372 373 374 375

        var c = CreateCompilationWithMscorlib(
@"public class A
{
    internal class B
    {
        protected B(C o)
        {
            o.Foo();
        }
    }
}",
            new[] { new CSharpCompilationReference(other) },
            assemblyName: "WantsIVTAccessButCantHave",
376
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391

        //compilation should not succeed, and internals should not be imported.
        c.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_BadAccess, "Foo").WithArguments("C.Foo()"));

        var c2 = CreateCompilationWithMscorlib(
@"public class A
{
    internal class B
    {
        protected B(C o)
        {
            o.Foo();
        }
    }
}",
392
            new[] { new CSharpCompilationReference(other) },
P
Pilchie 已提交
393
            assemblyName: "WantsIVTAccess",
394
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
395 396 397 398 399 400 401 402 403 404

        Assert.Empty(c2.GetDiagnostics());
    }

    [Fact]
    public void IVTBasicMetadata()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""WantsIVTAccess"")]
            public class C { internal void Foo() {} }";

405
        var otherStream = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider)).EmitToStream();
P
Pilchie 已提交
406 407 408 409 410 411 412 413 414 415 416 417

        var c = CreateCompilationWithMscorlib(
@"public class A
{
    internal class B
    {
        protected B(C o)
        {
            o.Foo();
        }
    }
}",
418
        references: new[] { AssemblyMetadata.CreateFromStream(otherStream, leaveOpen: true).GetReference() },
P
Pilchie 已提交
419
        assemblyName: "WantsIVTAccessButCantHave",
420
        options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
421 422 423 424

        //compilation should not succeed, and internals should not be imported.
        c.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_NoSuchMemberOrExtension, "Foo").WithArguments("C", "Foo"));

425
        otherStream.Position = 0;
P
Pilchie 已提交
426 427 428 429 430 431 432 433 434 435 436 437

        var c2 = CreateCompilationWithMscorlib(
@"public class A
{
    internal class B
    {
        protected B(C o)
        {
            o.Foo();
        }
    }
}",
438
            new[] { MetadataReference.CreateFromStream(otherStream) },
P
Pilchie 已提交
439
            assemblyName: "WantsIVTAccess",
440
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
441 442 443 444 445 446 447 448 449 450 451

        Assert.Empty(c2.GetDiagnostics());
    }

    [Fact]
    public void IVTSigned()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            public class C { internal void Foo() {} }";

        var other = CreateCompilationWithMscorlib(s,
452
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
            assemblyName: "Paul");

        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"public class A
{
    internal class B
    {
        protected B(C o)
        {
            o.Foo();
        }
    }
}",
            new MetadataReference[] { new CSharpCompilationReference(other) },
469
            TestOptions.ReleaseDll.WithCryptoKeyContainer("roslynTestContainer").WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
470 471 472 473 474 475 476 477 478 479 480
            assemblyName: "John");

        Assert.Empty(requestor.GetDiagnostics());
    }

    [Fact]
    public void IVTErrorNotBothSigned()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            public class C { internal void Foo() {} }";

481
        var other = CreateCompilationWithMscorlib(s, assemblyName: "Paul", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"public class A
{
    internal class B
    {
        protected B(C o)
        {
            o.Foo();
        }
    }
}",
            references: new[] { new CSharpCompilationReference(other) },
            assemblyName: "John",
497
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514

        // We allow John to access Paul's internal Foo even though strong-named John should not be referencing weak-named Paul.
        // Paul has, after all, specifically granted access to John.

        // TODO: During emit time we should produce an error that says that a strong-named assembly cannot reference
        // TODO: a weak-named assembly.
        requestor.VerifyDiagnostics();
    }

    [Fact]
    public void IVTDeferredSuccess()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            internal class CAttribute : System.Attribute { public CAttribute() {} }";

        var other = CreateCompilationWithMscorlib(s,
            assemblyName: "Paul",
515
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
516 517 518 519 520 521 522 523 524 525 526 527

        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"
[assembly: C()]  //causes optimistic granting
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
public class A
{
}",
            new[] { new CSharpCompilationReference(other) },
            assemblyName: "John",
528
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
529

530
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, requestor.Assembly.Identity.PublicKey));
P
Pilchie 已提交
531 532 533 534 535 536 537 538 539 540 541
        Assert.Empty(requestor.GetDiagnostics());
    }

    [Fact]
    public void IVTDeferredFailSignMismatch()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            internal class CAttribute : System.Attribute { public CAttribute() {} }";

        var other = CreateCompilationWithMscorlib(s,
            assemblyName: "Paul",
542
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider)); //not signed. cryptoKeyFile: KeyPairFile,
P
Pilchie 已提交
543 544 545 546 547 548 549 550 551 552 553 554

        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"
[assembly: C()] //causes optimistic granting
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
public class A
{
}",
            new[] { new CSharpCompilationReference(other) },
            assemblyName: "John",
555
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
556

557
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, requestor.Assembly.Identity.PublicKey));
P
Pilchie 已提交
558 559 560 561 562 563 564 565 566 567 568
        requestor.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_FriendRefSigningMismatch, null, new object[] { "Paul, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" }));
    }

    [Fact]
    public void IVTDeferredFailKeyMismatch()
    {
        //key is wrong in the first digit. correct key starts with 0
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=10240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            internal class CAttribute : System.Attribute { public CAttribute() {} }";

        var other = CreateCompilationWithMscorlib(s,
569
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
570 571 572 573 574 575 576 577 578 579 580 581 582
            assemblyName: "Paul");

        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"
[assembly: C()]  //causes optimistic granting
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
public class A
{
}",
          new MetadataReference[] { new CSharpCompilationReference(other) },
          assemblyName: "John",
583
          options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
584

585
        Assert.True(ByteSequenceComparer.Equals(s_publicKey, requestor.Assembly.Identity.PublicKey));
P
Pilchie 已提交
586 587 588 589 590 591 592 593 594 595 596
        requestor.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_FriendRefNotEqualToThis, null, new object[] { "Paul, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2" }));
    }

    [Fact]
    public void IVTSuccessThroughIAssembly()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            internal class CAttribute : System.Attribute { public CAttribute() {} }";

        var other = CreateCompilationWithMscorlib(s,
            assemblyName: "Paul",
597 598
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));

P
Pilchie 已提交
599 600 601 602 603 604 605 606 607 608
        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"
[assembly: C()]  //causes optimistic granting
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
public class A
{
}",
            new MetadataReference[] { new CSharpCompilationReference(other) },
609
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
610 611 612 613 614 615 616 617 618 619 620 621 622 623
            assemblyName: "John");

        Assert.True(((IAssemblySymbol)other.Assembly).GivesAccessTo(requestor.Assembly));
        Assert.Empty(requestor.GetDiagnostics());
    }

    [Fact]
    public void IVTDeferredFailKeyMismatchIAssembly()
    {
        //key is wrong in the first digit. correct key starts with 0
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=10240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            internal class CAttribute : System.Attribute { public CAttribute() {} }";

        var other = CreateCompilationWithMscorlib(s,
624
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
625 626 627 628 629 630 631 632 633 634 635 636 637
            assemblyName: "Paul");

        other.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"

[assembly: C()]  //causes optimistic granting
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
public class A
{
}",
            new MetadataReference[] { new CSharpCompilationReference(other) },
638
            TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
639 640 641 642 643 644
            assemblyName: "John");

        Assert.False(((IAssemblySymbol)other.Assembly).GivesAccessTo(requestor.Assembly));
        requestor.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_FriendRefNotEqualToThis, null, new object[] { "Paul, Version=0.0.0.0, Culture=neutral, PublicKeyToken=ce65828c82a341f2" }));
    }

645
    [WorkItem(820450, "DevDiv")]
P
Pilchie 已提交
646 647 648 649 650 651 652 653
    [Fact]
    public void IVTGivesAccessToUsingDifferentKeys()
    {
        string s = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""John, PublicKey=00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"")]
            namespace ClassLibrary1 { internal class Class1 { } } ";

        var giver = CreateCompilationWithMscorlib(s,
            assemblyName: "Paul",
654
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(SigningTestHelpers.KeyPairFile2).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669

        giver.VerifyDiagnostics();

        var requestor = CreateCompilationWithMscorlib(
@"
namespace ClassLibrary2
{
    internal class A
    {
        public void Foo(ClassLibrary1.Class1 a)
        {   
        }
    }
}",
            new MetadataReference[] { new CSharpCompilationReference(giver) },
670
            options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
            assemblyName: "John");

        Assert.True(((IAssemblySymbol)giver.Assembly).GivesAccessTo(requestor.Assembly));
        Assert.Empty(requestor.GetDiagnostics());
    }
    #endregion

    #region IVT instantiations

    [Fact]
    public void IVTHasCulture()
    {
        var other = CreateCompilationWithMscorlib(
        @"
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo(""WantsIVTAccess, Culture=neutral"")]
public class C
{
  static void Foo() {}
}
691
", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
692 693 694 695 696 697 698 699 700 701 702 703 704 705 706

        other.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_FriendAssemblyBadArgs, @"InternalsVisibleTo(""WantsIVTAccess, Culture=neutral"")").WithArguments("WantsIVTAccess, Culture=neutral"));
    }

    [Fact]
    public void IVTNoKey()
    {
        var other = CreateCompilationWithMscorlib(
        @"
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo(""WantsIVTAccess"")]
public class C
{
  static void Main() {}
}
707
", options: TestOptions.ReleaseExe.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724

        other.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_FriendAssemblySNReq, @"InternalsVisibleTo(""WantsIVTAccess"")").WithArguments("WantsIVTAccess"));
    }

    #endregion

    #region Signing

    [Fact]
    public void SignIt()
    {
        var other = CreateCompilationWithMscorlib(
        @"
public class C
{
  static void Foo() {}
}",
725
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.True(success.Success);
        }

        AssertFileIsSigned(tempFile);
    }

    private static void AssertFileIsSigned(TempFile file)
    {
        //TODO should check to see that the output was actually signed
        using (var metadata = new FileStream(file.Path, FileMode.Open))
        {
            var flags = new PEHeaders(metadata).CorHeader.Flags;
            Assert.Equal(CorFlags.StrongNameSigned, flags & CorFlags.StrongNameSigned);
        }
    }

748
    private void ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(MemoryStream moduleContents, AttributeDescription expectedModuleAttr)
P
Pilchie 已提交
749 750 751 752 753 754 755 756 757
    {
        //a module doesn't get signed for real. It should have either a keyfile or keycontainer attribute
        //parked on a typeRef named 'AssemblyAttributesGoHere.' When the module is added to an assembly, the
        //resulting assembly is signed with the key referred to by the aforementioned attribute.

        EmitResult success;
        var tempFile = Temp.CreateFile();
        moduleContents.Position = 0;

758
        using (var metadata = ModuleMetadata.CreateFromStream(moduleContents))
P
Pilchie 已提交
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
        {
            var flags = metadata.Module.PEReaderOpt.PEHeaders.CorHeader.Flags;
            //confirm file does not claim to be signed
            Assert.Equal(0, (int)(flags & CorFlags.StrongNameSigned));
            Handle token = metadata.Module.GetTypeRef(metadata.Module.GetAssemblyRef("mscorlib"), "System.Runtime.CompilerServices", "AssemblyAttributesGoHere");
            Assert.False(token.IsNil);   //could the type ref be located? If not then the attribute's not there.
            var attrInfos = metadata.Module.FindTargetAttributes(token, expectedModuleAttr);
            Assert.Equal(1, attrInfos.Count());

            var source = @"
public class Z
{
}";

            //now that the module checks out, ensure that adding it to a compilation outputing a dll
            //results in a signed assembly.
775
            var assemblyComp = CreateCompilationWithMscorlib(source,
776
                new[] { metadata.GetReference() },
777
                TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793

            using (var finalStrm = tempFile.Open())
            {
                success = assemblyComp.Emit(finalStrm);
            }
        }

        success.Diagnostics.Verify();

        Assert.True(success.Success);
        AssertFileIsSigned(tempFile);
    }

    [Fact]
    public void SignModuleKeyFileAttr()
    {
794
        var x = s_keyPairFile;
P
Pilchie 已提交
795 796
        string s = String.Format("{0}{1}{2}", @"[assembly: System.Reflection.AssemblyKeyFile(@""", x, @""")] public class C {}");

797
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
798 799 800 801 802 803 804 805 806 807 808 809 810

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.True(success.Success);

        ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(outStrm, AttributeDescription.AssemblyKeyFileAttribute);
    }

    [Fact]
    public void SignModuleKeyContainerAttr()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")] public class C {}";

811
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
812 813 814 815 816 817 818 819 820 821 822 823 824

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.True(success.Success);

        ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(outStrm, AttributeDescription.AssemblyKeyNameAttribute);
    }

    [Fact]
    public void SignModuleKeyContainerBogus()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyName(""bogus"")] public class C {}";

825
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
826 827 828 829 830
        //shouldn't have an error. The attribute's contents are checked when the module is added.
        var reference = other.EmitToImageReference();

        s = @"class D {}";

831
        other = CreateCompilationWithMscorlib(s, new[] { reference }, TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
832 833 834 835 836 837 838 839

        // error CS7028: Error signing output with public key from container 'bogus' -- Keyset does not exist (Exception from HRESULT: 0x80090016)
        var err = other.GetDiagnostics().Single();

        Assert.Equal((int)ErrorCode.ERR_PublicKeyContainerFailure, err.Code);
        Assert.Equal(2, err.Arguments.Count);
        Assert.Equal("bogus", err.Arguments[0]);
        Assert.True(((string)err.Arguments[1]).EndsWith(" HRESULT: 0x80090016)"));
P
Pilchie 已提交
840 841 842 843 844 845 846
    }

    [Fact]
    public void SignModuleKeyFileBogus()
    {
        string s = @"[assembly: System.Reflection.AssemblyKeyFile(""bogus"")] public class C {}";

847
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
848 849 850 851 852 853

        //shouldn't have an error. The attribute's contents are checked when the module is added.
        var reference = other.EmitToImageReference();

        s = @"class D {}";

854
        other = CreateCompilationWithMscorlib(s, new[] { reference }, TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
855
        other.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments("bogus", CodeAnalysisResources.FileNotFound));
P
Pilchie 已提交
856 857
    }

858
    [WorkItem(531195, "DevDiv")]
P
Pilchie 已提交
859 860 861 862 863
    [Fact()]
    public void SignModuleKeyContainerCmdLine()
    {
        string s = "public class C {}";

864
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithCryptoKeyContainer("roslynTestContainer").WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
865 866 867 868 869 870 871 872

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.True(success.Success);

        ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(outStrm, AttributeDescription.AssemblyKeyNameAttribute);
    }

873
    [WorkItem(531195, "DevDiv")]
P
Pilchie 已提交
874 875 876 877 878 879 880
    [Fact()]
    public void SignModuleKeyContainerCmdLine_1()
    {
        string s = @"
[assembly: System.Reflection.AssemblyKeyName(""roslynTestContainer"")]
public class C {}";

881 882
        var other = CreateCompilationWithMscorlib(s,
            options: TestOptions.ReleaseModule.WithCryptoKeyContainer("roslynTestContainer").WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
883 884 885 886 887 888 889 890

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.True(success.Success);

        ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(outStrm, AttributeDescription.AssemblyKeyNameAttribute);
    }

891
    [WorkItem(531195, "DevDiv")]
P
Pilchie 已提交
892 893 894 895 896 897 898
    [Fact()]
    public void SignModuleKeyContainerCmdLine_2()
    {
        string s = @"
[assembly: System.Reflection.AssemblyKeyName(""bogus"")]
public class C {}";

899
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithCryptoKeyContainer("roslynTestContainer").WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
900 901 902 903 904

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.False(success.Success);
        success.Diagnostics.Verify(
905
    // error CS7091: Attribute 'System.Reflection.AssemblyKeyNameAttribute' given in a source file conflicts with option 'CryptoKeyContainer'.
P
Pilchie 已提交
906 907 908 909
    Diagnostic(ErrorCode.ERR_CmdOptionConflictsSource).WithArguments("System.Reflection.AssemblyKeyNameAttribute", "CryptoKeyContainer")
            );
    }

910
    [WorkItem(531195, "DevDiv")]
P
Pilchie 已提交
911 912 913 914 915
    [Fact()]
    public void SignModuleKeyFileCmdLine()
    {
        string s = "public class C {}";

916
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
917 918 919 920 921 922 923 924

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.True(success.Success);

        ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(outStrm, AttributeDescription.AssemblyKeyFileAttribute);
    }

925
    [WorkItem(531195, "DevDiv")]
P
Pilchie 已提交
926 927 928
    [Fact()]
    public void SignModuleKeyFileCmdLine_1()
    {
929
        var x = s_keyPairFile;
P
Pilchie 已提交
930 931
        string s = String.Format("{0}{1}{2}", @"[assembly: System.Reflection.AssemblyKeyFile(@""", x, @""")] public class C {}");

932
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
933 934 935 936 937 938 939 940

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.True(success.Success);

        ConfirmModuleAttributePresentAndAddingToAssemblyResultsInSignedOutput(outStrm, AttributeDescription.AssemblyKeyFileAttribute);
    }

941
    [WorkItem(531195, "DevDiv")]
P
Pilchie 已提交
942 943 944
    [Fact()]
    public void SignModuleKeyFileCmdLine_2()
    {
945
        var x = s_keyPairFile;
P
Pilchie 已提交
946 947
        string s = @"[assembly: System.Reflection.AssemblyKeyFile(""bogus"")] public class C {}";

948
        var other = CreateCompilationWithMscorlib(s, options: TestOptions.ReleaseModule.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966

        var outStrm = new MemoryStream();
        var success = other.Emit(outStrm);
        Assert.False(success.Success);
        success.Diagnostics.Verify(
            // error CS7091: Attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file conflicts with option 'CryptoKeyFile'.
            Diagnostic(ErrorCode.ERR_CmdOptionConflictsSource).WithArguments("System.Reflection.AssemblyKeyFileAttribute", "CryptoKeyFile"));
    }

    [Fact]
    public void SignItWithOnlyPublicKey()
    {
        var other = CreateCompilationWithMscorlib(
        @"
public class C
{
  static void Foo() {}
}",
967
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
968 969 970

        var outStrm = new MemoryStream();
        var emitResult = other.Emit(outStrm);
971
        other.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_SignButNoPrivateKey).WithArguments(s_publicKeyFile));
P
Pilchie 已提交
972

973
        other = other.WithOptions(TestOptions.ReleaseModule.WithCryptoKeyFile(s_publicKeyFile));
P
Pilchie 已提交
974

975 976 977
        var assembly = CreateCompilationWithMscorlib("",
            references: new[] { other.EmitToImageReference() },
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
978

979
        assembly.VerifyDiagnostics(Diagnostic(ErrorCode.ERR_SignButNoPrivateKey).WithArguments(s_publicKeyFile));
P
Pilchie 已提交
980 981 982 983 984 985 986 987 988 989 990
    }

    [Fact]
    public void DelaySignItWithOnlyPublicKey()
    {
        var other = CreateCompilationWithMscorlib(
            @"
[assembly: System.Reflection.AssemblyDelaySign(true)]
public class C
{
  static void Foo() {}
991
}", options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009

        using (var outStrm = new MemoryStream())
        {
            var emitResult = other.Emit(outStrm);
            Assert.True(emitResult.Success);
        }
    }

    [Fact]
    public void DelaySignButNoKey()
    {
        var other = CreateCompilationWithMscorlib(
            @"
[assembly: System.Reflection.AssemblyDelaySign(true)]
public class C
{
  static void Foo() {}
}",
1010
  options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029

        var outStrm = new MemoryStream();
        var emitResult = other.Emit(outStrm);
        // Dev11: warning CS1699: Use command line option '/delaysign' or appropriate project settings instead of 'AssemblyDelaySignAttribute'
        //        warning CS1607: Assembly generation -- Delay signing was requested, but no key was given
        // Roslyn: warning CS7033: Delay signing was specified and requires a public key, but no public key was specified
        other.VerifyDiagnostics(Diagnostic(ErrorCode.WRN_DelaySignButNoKey));
        Assert.True(emitResult.Success);
    }

    [Fact]
    public void SignInMemory()
    {
        var other = CreateCompilationWithMscorlib(
            @"
public class C
{
  static void Foo() {}
}",
1030
options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
        var outStrm = new MemoryStream();
        var emitResult = other.Emit(outStrm);
        Assert.True(emitResult.Success);
    }

    [Fact]
    public void DelaySignConflict()
    {
        var other = CreateCompilationWithMscorlib(
            @"
[assembly: System.Reflection.AssemblyDelaySign(true)]
public class C
{
  static void Foo() {}
1045
}", options: TestOptions.ReleaseDll.WithDelaySign(false).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062

        var outStrm = new MemoryStream();
        //shouldn't get any key warning.
        other.VerifyDiagnostics(Diagnostic(ErrorCode.WRN_CmdOptionConflictsSource).WithArguments("DelaySign", "System.Reflection.AssemblyDelaySignAttribute"));
        var emitResult = other.Emit(outStrm);
        Assert.True(emitResult.Success);
    }

    [Fact]
    public void DelaySignNoConflict()
    {
        var other = CreateCompilationWithMscorlib(
            @"
[assembly: System.Reflection.AssemblyDelaySign(true)]
public class C
{
  static void Foo() {}
1063
}", options: TestOptions.ReleaseDll.WithDelaySign(true).WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089

        var outStrm = new MemoryStream();
        //shouldn't get any key warning.
        other.VerifyDiagnostics();
        var emitResult = other.Emit(outStrm);
        Assert.True(emitResult.Success);
    }

    [Fact]
    public void DelaySignWithAssemblySignatureKey()
    {
        //Note that this SignatureKey is some random one that I found in the devdiv build.
        //It is not related to the other keys we use in these tests.

        //In the native compiler, when the AssemblySignatureKey attribute is present, and
        //the binary is configured for delay signing, the contents of the assemblySignatureKey attribute
        //(rather than the contents of the keyfile or container) are used to compute the size needed to 
        //reserve in the binary for its signature. Signing using this key is only supported via sn.exe

        var other = CreateCompilation(
            @"
[assembly: System.Reflection.AssemblyDelaySign(true)]
[assembly: System.Reflection.AssemblySignatureKey(""002400000c800000140100000602000000240000525341310008000001000100613399aff18ef1a2c2514a273a42d9042b72321f1757102df9ebada69923e2738406c21e5b801552ab8d200a65a235e001ac9adc25f2d811eb09496a4c6a59d4619589c69f5baf0c4179a47311d92555cd006acc8b5959f2bd6e10e360c34537a1d266da8085856583c85d81da7f3ec01ed9564c58d93d713cd0172c8e23a10f0239b80c96b07736f5d8b022542a4e74251a5f432824318b3539a5a087f8e53d2f135f9ca47f3bb2e10aff0af0849504fb7cea3ff192dc8de0edad64c68efde34c56d302ad55fd6e80f302d5efcdeae953658d3452561b5f36c542efdbdd9f888538d374cef106acf7d93a4445c3c73cd911f0571aaf3d54da12b11ddec375b3"", ""a5a866e1ee186f807668209f3b11236ace5e21f117803a3143abb126dd035d7d2f876b6938aaf2ee3414d5420d753621400db44a49c486ce134300a2106adb6bdb433590fef8ad5c43cba82290dc49530effd86523d9483c00f458af46890036b0e2c61d077d7fbac467a506eba29e467a87198b053c749aa2a4d2840c784e6d"")]
public class C
{
  static void Foo() {}
1090 1091 1092
}",
            new MetadataReference[] { MscorlibRef_v4_0_30316_17626 },
            options: TestOptions.ReleaseDll.WithDelaySign(true).WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1093 1094 1095 1096 1097 1098 1099 1100 1101

        using (var metadata = ModuleMetadata.CreateFromImage(other.EmitToArray()))
        {
            var header = metadata.Module.PEReaderOpt.PEHeaders.CorHeader;
            //confirm header has expected SN signature size
            Assert.Equal(256, header.StrongNameSignatureDirectory.Size);
        }
    }

1102 1103
    [WorkItem(545720, "DevDiv")]
    [WorkItem(530050, "DevDiv")]
P
Pilchie 已提交
1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
    [Fact]
    public void InvalidAssemblyName()
    {
        var il = @"
.assembly extern mscorlib { }
.assembly asm1
{
    .custom instance void [mscorlib]System.Runtime.CompilerServices.InternalsVisibleToAttribute::.ctor(string) = ( 01 00 09 2F 5C 3A 2A 3F 27 3C 3E 7C 00 00 ) // .../\:*?'<>|..
}

.class private auto ansi beforefieldinit Base
       extends [mscorlib]System.Object
{
  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    ldarg.0
    call       instance void [mscorlib]System.Object::.ctor()
    ret
  }
}
";

        var csharp = @"
class Derived : Base 
{
}
";

        var ilRef = CompileIL(il, appendDefaultHeader: false);

1135
        var comp = CreateCompilationWithMscorlib(csharp, new[] { ilRef }, assemblyName: "asm2", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1136 1137 1138 1139 1140 1141 1142 1143
        comp.VerifyDiagnostics(
            // NOTE: dev10 reports WRN_InvalidAssemblyName, but Roslyn won't (DevDiv #15099).

            // (2,17): error CS0122: 'Base' is inaccessible due to its protection level
            // class Derived : Base 
            Diagnostic(ErrorCode.ERR_BadAccess, "Base").WithArguments("Base"));
    }

1144
    [WorkItem(546331, "DevDiv")]
P
Pilchie 已提交
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
    [Fact]
    public void IvtVirtualCall1()
    {
        var source1 = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm2"")]

public class A
{
    internal virtual void M() { }
    internal virtual int P { get { return 0; } }
    internal virtual event System.Action E { add { } remove { } }
}
";
        var source2 = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm3"")]

public class B : A
{
    internal override void M() { }
    internal override int P { get { return 0; } }
    internal override event System.Action E { add { } remove { } }
}
";
        var source3 = @"
using System;
using System.Linq.Expressions;

public class C : B
{
    internal override void M() { }

    void Test()
    {
        C c = new C();
        c.M();
        int x = c.P;
        c.E += null;
    }

    void TestET() 
    {
        C c = new C();
        Expression<Action> expr = () => c.M();
    }
}
";

1192
        var comp1 = CreateCompilationWithMscorlib(source1, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm1");
P
Pilchie 已提交
1193 1194 1195
        comp1.VerifyDiagnostics();
        var ref1 = new CSharpCompilationReference(comp1);

1196
        var comp2 = CreateCompilationWithMscorlib(source2, new[] { ref1 }, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm2");
P
Pilchie 已提交
1197 1198 1199
        comp2.VerifyDiagnostics();
        var ref2 = new CSharpCompilationReference(comp2);

1200
        var comp3 = CreateCompilationWithMscorlib(source3, new[] { SystemCoreRef, ref1, ref2 }, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm3");
P
Pilchie 已提交
1201 1202 1203
        comp3.VerifyDiagnostics();

        // Note: calls B.M, not A.M, since asm1 is not accessible.
1204
        var verifier = CompileAndVerify(comp3, emitOptions: TestEmitters.CCI);
1205

P
Pilchie 已提交
1206 1207
        verifier.VerifyIL("C.Test", @"
{
1208
  // Code size       25 (0x19)
P
Pilchie 已提交
1209 1210
  .maxstack  2
  IL_0000:  newobj     ""C..ctor()""
1211 1212 1213 1214 1215 1216 1217 1218
  IL_0005:  dup
  IL_0006:  callvirt   ""void B.M()""
  IL_000b:  dup
  IL_000c:  callvirt   ""int B.P.get""
  IL_0011:  pop
  IL_0012:  ldnull
  IL_0013:  callvirt   ""void B.E.add""
  IL_0018:  ret
P
Pilchie 已提交
1219 1220 1221 1222
}");

        verifier.VerifyIL("C.TestET", @"
{
1223
  // Code size       85 (0x55)
P
Pilchie 已提交
1224
  .maxstack  3
1225
  IL_0000:  newobj     ""C.<>c__DisplayClass2_0..ctor()""
1226 1227
  IL_0005:  dup
  IL_0006:  newobj     ""C..ctor()""
1228 1229
  IL_000b:  stfld      ""C C.<>c__DisplayClass2_0.c""
  IL_0010:  ldtoken    ""C.<>c__DisplayClass2_0""
1230 1231
  IL_0015:  call       ""System.Type System.Type.GetTypeFromHandle(System.RuntimeTypeHandle)""
  IL_001a:  call       ""System.Linq.Expressions.ConstantExpression System.Linq.Expressions.Expression.Constant(object, System.Type)""
1232
  IL_001f:  ldtoken    ""C C.<>c__DisplayClass2_0.c""
1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
  IL_0024:  call       ""System.Reflection.FieldInfo System.Reflection.FieldInfo.GetFieldFromHandle(System.RuntimeFieldHandle)""
  IL_0029:  call       ""System.Linq.Expressions.MemberExpression System.Linq.Expressions.Expression.Field(System.Linq.Expressions.Expression, System.Reflection.FieldInfo)""
  IL_002e:  ldtoken    ""void B.M()""
  IL_0033:  call       ""System.Reflection.MethodBase System.Reflection.MethodBase.GetMethodFromHandle(System.RuntimeMethodHandle)""
  IL_0038:  castclass  ""System.Reflection.MethodInfo""
  IL_003d:  ldc.i4.0
  IL_003e:  newarr     ""System.Linq.Expressions.Expression""
  IL_0043:  call       ""System.Linq.Expressions.MethodCallExpression System.Linq.Expressions.Expression.Call(System.Linq.Expressions.Expression, System.Reflection.MethodInfo, params System.Linq.Expressions.Expression[])""
  IL_0048:  ldc.i4.0
  IL_0049:  newarr     ""System.Linq.Expressions.ParameterExpression""
  IL_004e:  call       ""System.Linq.Expressions.Expression<System.Action> System.Linq.Expressions.Expression.Lambda<System.Action>(System.Linq.Expressions.Expression, params System.Linq.Expressions.ParameterExpression[])""
  IL_0053:  pop
  IL_0054:  ret
P
Pilchie 已提交
1246 1247 1248 1249
}
");
    }

1250
    [WorkItem(546331, "DevDiv")]
P
Pilchie 已提交
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308
    [Fact]
    public void IvtVirtualCall2()
    {
        var source1 = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm2"")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm4"")]

public class A
{
    internal virtual void M() { }
    internal virtual int P { get { return 0; } }
    internal virtual event System.Action E { add { } remove { } }
}
";
        var source2 = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm3"")]

public class B : A
{
    internal override void M() { }
    internal override int P { get { return 0; } }
    internal override event System.Action E { add { } remove { } }
}
";
        var source3 = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm4"")]

public class C : B
{
    internal override void M() { }
    internal override int P { get { return 0; } }
    internal override event System.Action E { add { } remove { } }
}
";
        var source4 = @"
using System;
using System.Linq.Expressions;

public class D : C
{
    internal override void M() { }

    void Test()
    {
        D d = new D();
        d.M();
        int x = d.P;
        d.E += null;
    }

    void TestET() 
    {
        D d = new D();
        Expression<Action> expr = () => d.M();
    }
}
";

1309
        var comp1 = CreateCompilationWithMscorlib(source1, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm1");
P
Pilchie 已提交
1310 1311 1312
        comp1.VerifyDiagnostics();
        var ref1 = new CSharpCompilationReference(comp1);

1313
        var comp2 = CreateCompilationWithMscorlib(source2, new[] { ref1 }, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm2");
P
Pilchie 已提交
1314 1315 1316
        comp2.VerifyDiagnostics();
        var ref2 = new CSharpCompilationReference(comp2);

1317
        var comp3 = CreateCompilationWithMscorlib(source3, new[] { ref1, ref2 }, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm3");
P
Pilchie 已提交
1318 1319 1320
        comp3.VerifyDiagnostics();
        var ref3 = new CSharpCompilationReference(comp3);

1321
        var comp4 = CreateCompilationWithMscorlib(source4, new[] { SystemCoreRef, ref1, ref2, ref3 }, options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "asm4");
P
Pilchie 已提交
1322 1323 1324 1325
        comp4.VerifyDiagnostics();

        // Note: calls C.M, not A.M, since asm2 is not accessible (stops search).
        // Confirmed in Dev11.
1326
        var verifier = CompileAndVerify(comp4, emitOptions: TestEmitters.CCI);
1327

P
Pilchie 已提交
1328 1329
        verifier.VerifyIL("D.Test", @"
{
1330
  // Code size       25 (0x19)
P
Pilchie 已提交
1331 1332
  .maxstack  2
  IL_0000:  newobj     ""D..ctor()""
1333 1334 1335 1336 1337 1338 1339 1340
  IL_0005:  dup
  IL_0006:  callvirt   ""void C.M()""
  IL_000b:  dup
  IL_000c:  callvirt   ""int C.P.get""
  IL_0011:  pop
  IL_0012:  ldnull
  IL_0013:  callvirt   ""void C.E.add""
  IL_0018:  ret
P
Pilchie 已提交
1341 1342 1343 1344
}");

        verifier.VerifyIL("D.TestET", @"
{
1345
  // Code size       85 (0x55)
P
Pilchie 已提交
1346
  .maxstack  3
1347
  IL_0000:  newobj     ""D.<>c__DisplayClass2_0..ctor()""
1348 1349
  IL_0005:  dup
  IL_0006:  newobj     ""D..ctor()""
1350 1351
  IL_000b:  stfld      ""D D.<>c__DisplayClass2_0.d""
  IL_0010:  ldtoken    ""D.<>c__DisplayClass2_0""
1352 1353
  IL_0015:  call       ""System.Type System.Type.GetTypeFromHandle(System.RuntimeTypeHandle)""
  IL_001a:  call       ""System.Linq.Expressions.ConstantExpression System.Linq.Expressions.Expression.Constant(object, System.Type)""
1354
  IL_001f:  ldtoken    ""D D.<>c__DisplayClass2_0.d""
1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
  IL_0024:  call       ""System.Reflection.FieldInfo System.Reflection.FieldInfo.GetFieldFromHandle(System.RuntimeFieldHandle)""
  IL_0029:  call       ""System.Linq.Expressions.MemberExpression System.Linq.Expressions.Expression.Field(System.Linq.Expressions.Expression, System.Reflection.FieldInfo)""
  IL_002e:  ldtoken    ""void C.M()""
  IL_0033:  call       ""System.Reflection.MethodBase System.Reflection.MethodBase.GetMethodFromHandle(System.RuntimeMethodHandle)""
  IL_0038:  castclass  ""System.Reflection.MethodInfo""
  IL_003d:  ldc.i4.0
  IL_003e:  newarr     ""System.Linq.Expressions.Expression""
  IL_0043:  call       ""System.Linq.Expressions.MethodCallExpression System.Linq.Expressions.Expression.Call(System.Linq.Expressions.Expression, System.Reflection.MethodInfo, params System.Linq.Expressions.Expression[])""
  IL_0048:  ldc.i4.0
  IL_0049:  newarr     ""System.Linq.Expressions.ParameterExpression""
  IL_004e:  call       ""System.Linq.Expressions.Expression<System.Action> System.Linq.Expressions.Expression.Lambda<System.Action>(System.Linq.Expressions.Expression, params System.Linq.Expressions.ParameterExpression[])""
  IL_0053:  pop
  IL_0054:  ret
P
Pilchie 已提交
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
}");
    }

    [Fact]
    public void IvtVirtual_ParamsAndDynamic()
    {
        var source1 = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm2"")]

public class A
{
    internal virtual void F(params int[] a) { }
    internal virtual void G(System.Action<dynamic> a) { }

    [System.Obsolete(""obsolete"", true)]
    internal virtual void H() { }

    internal virtual int this[int x, params int[] a] { get { return 0; } }
}
";
        // use IL to generate code that doesn't have synthesized ParamArrayAttribute on int[] parameters:

        // [assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""asm3"")]
        // public class B : A
        // {
        //     internal override void F(int[] a) { }                            
        //     internal override void G(System.Action<object> a) { }
        //     internal override void H() { }
        //     internal override int this[int x, int[] a] { get { return 0; } }
        // }

        var source2 = @"
.assembly extern asm1
{
  .ver 0:0:0:0
}
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly asm2
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.InternalsVisibleToAttribute::.ctor(string) = ( 01 00 04 61 73 6D 33 00 00 )                      // ...asm3..
}

.class public auto ansi beforefieldinit B extends [asm1]A
{
  .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 )                      // ...Item..
  
  .method assembly hidebysig strict virtual instance void  F(int32[] a) cil managed 
  {
    nop
    ret
  }

  .method assembly hidebysig strict virtual instance void  G(class [mscorlib]System.Action`1<object> a) cil managed
  {
    nop
    ret
  }

  .method assembly hidebysig strict virtual instance void  H() cil managed
  {
    nop
    ret
  }

  .method assembly hidebysig specialname strict virtual instance int32  get_Item(int32 x, int32[] a) cil managed
  {
    ldloc.0
    ret
  }

  .method public hidebysig specialname rtspecialname instance void  .ctor() cil managed
  {
    ldarg.0
    call       instance void [asm1]A::.ctor()
    ret
  }

  .property instance int32 Item(int32, int32[])
  {
    .get instance int32 B::get_Item(int32,
                                    int32[])
  }
}";

        var source3 = @"
public class C : B
{
    void Test()
    {
        C c = new C();
        c.F();
        c.G(x => x.Bar());
        c.H();
        var z = c[1];
    }
}
";

1470 1471 1472
        var comp1 = CreateCompilationWithMscorlib(source1,
            new[] { SystemCoreRef },
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
1473 1474 1475 1476 1477 1478 1479
            assemblyName: "asm1");

        comp1.VerifyDiagnostics();
        var ref1 = new CSharpCompilationReference(comp1);

        var ref2 = CompileIL(source2, appendDefaultHeader: false);

1480 1481 1482
        var comp3 = CreateCompilationWithMscorlib(source3,
            new[] { SystemCoreRef, ref1, ref2 },
            options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider),
P
Pilchie 已提交
1483 1484 1485
            assemblyName: "asm3");

        comp3.VerifyDiagnostics(
1486
            // (7,9): error CS7036: There is no argument given that corresponds to the required formal parameter 'a' of 'B.F(int[])'
1487
            Diagnostic(ErrorCode.ERR_NoCorrespondingArgument, "F").WithArguments("a", "B.F(int[])").WithLocation(7, 11),
P
Pilchie 已提交
1488
            // (8,20): error CS1061: 'object' does not contain a definition for 'Bar' and no extension method 'Bar' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
1489 1490 1491
            Diagnostic(ErrorCode.ERR_NoSuchMemberOrExtension, "Bar").WithArguments("object", "Bar").WithLocation(8, 20),
            // (10,17): error CS7036: There is no argument given that corresponds to the required formal parameter 'a' of 'B.this[int, int[]]'
            Diagnostic(ErrorCode.ERR_NoCorrespondingArgument, "c[1]").WithArguments("a", "B.this[int, int[]]").WithLocation(10, 17));
P
Pilchie 已提交
1492 1493
    }

1494 1495
    [Fact]
    [WorkItem(529779, "DevDiv")]
P
Pilchie 已提交
1496 1497 1498 1499 1500 1501
    public void Bug529779_1()
    {
        CSharpCompilation unsigned = CreateCompilationWithMscorlib(
@"
public class C1
{}
1502
", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "Unsigned");
P
Pilchie 已提交
1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513

        CSharpCompilation other = CreateCompilationWithMscorlib(
@"
public class C
{
    internal void Foo()
    {
        var x = new System.Guid();
        System.Console.WriteLine(x);
    }
}
1514
", options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider));
P
Pilchie 已提交
1515

1516
        CompileAndVerify(other.WithReferences(new[] { other.References.ElementAt(0), new CSharpCompilationReference(unsigned) }),
1517
                         emitOptions: TestEmitters.CCI).VerifyDiagnostics();
P
Pilchie 已提交
1518

1519
        CompileAndVerify(other.WithReferences(new[] { other.References.ElementAt(0), MetadataReference.CreateFromStream(unsigned.EmitToStream()) }),
1520
                         emitOptions: TestEmitters.CCI).VerifyDiagnostics();
P
Pilchie 已提交
1521 1522
    }

1523 1524
    [Fact]
    [WorkItem(529779, "DevDiv")]
P
Pilchie 已提交
1525 1526 1527 1528 1529 1530
    public void Bug529779_2()
    {
        CSharpCompilation unsigned = CreateCompilationWithMscorlib(
@"
public class C1
{}
1531
", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "Unsigned");
P
Pilchie 已提交
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542

        CSharpCompilation other = CreateCompilationWithMscorlib(
@"
public class C
{
    internal void Foo()
    {
        var x = new C1();
        System.Console.WriteLine(x);
    }
}
1543
", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider).WithCryptoKeyFile(s_keyPairFile));
P
Pilchie 已提交
1544

1545
        var comps = new[] {other.WithReferences(new []{other.References.ElementAt(0), new CSharpCompilationReference(unsigned)}),
1546
                            other.WithReferences(new []{other.References.ElementAt(0), MetadataReference.CreateFromStream(unsigned.EmitToStream()) })};
P
Pilchie 已提交
1547 1548 1549 1550 1551 1552

        foreach (var comp in comps)
        {
            var outStrm = new MemoryStream();
            var emitResult = comp.Emit(outStrm);

1553 1554
            // Dev12 reports an error
            Assert.True(emitResult.Success);
P
Pilchie 已提交
1555 1556

            emitResult.Diagnostics.Verify(
1557 1558
                // warning CS8002: Referenced assembly 'Unsigned, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have a strong name.
                Diagnostic(ErrorCode.WRN_ReferencedAssemblyDoesNotHaveStrongName).WithArguments("Unsigned, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"));
P
Pilchie 已提交
1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574
        }
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_1()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
""00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"",
""bc6402e37ad723580b576953f40475ceae4b784d3661b90c3c6f5a1f7283388a7880683e0821610bee977f70506bb75584080e01b2ec97483c4d601ce1c981752a07276b420d78594d0ef28f8ec016d0a5b6d56cfc22e9f25a2ed9545942ccbf2d6295b9528641d98776e06a3273ab233271a3c9f53099b4d4e029582a6d5819"")]

public class C
{
  static void Foo() {}
}",
1575
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.True(success.Success);
        }

        AssertFileIsSigned(tempFile);
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_2()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
""xxx 00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"",
""bc6402e37ad723580b576953f40475ceae4b784d3661b90c3c6f5a1f7283388a7880683e0821610bee977f70506bb75584080e01b2ec97483c4d601ce1c981752a07276b420d78594d0ef28f8ec016d0a5b6d56cfc22e9f25a2ed9545942ccbf2d6295b9528641d98776e06a3273ab233271a3c9f53099b4d4e029582a6d5819"")]

public class C
{
  static void Foo() {}
}",
1601
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.False(success.Success);
            success.Diagnostics.Verify(
                // (3,1): error CS8003: Invalid signature public key specified in AssemblySignatureKeyAttribute.
                // "xxx 00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb",
                Diagnostic(ErrorCode.ERR_InvalidSignaturePublicKey, @"""xxx 00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"""));
        }
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_3()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
""00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"",
""FFFFbc6402e37ad723580b576953f40475ceae4b784d3661b90c3c6f5a1f7283388a7880683e0821610bee977f70506bb75584080e01b2ec97483c4d601ce1c981752a07276b420d78594d0ef28f8ec016d0a5b6d56cfc22e9f25a2ed9545942ccbf2d6295b9528641d98776e06a3273ab233271a3c9f53099b4d4e029582a6d5819"")]

public class C
{
  static void Foo() {}
}",
1629
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_keyPairFile).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var result = other.Emit(outStrm);
            Assert.False(result.Success);
            result.Diagnostics.VerifyErrorCodes(
                // error CS7027: Error signing output with public key from file 'KeyPairFile.snk' -- Invalid countersignature specified in AssemblySignatureKeyAttribute. (Exception from HRESULT: 0x80131423)
                Diagnostic(ErrorCode.ERR_PublicKeyFileFailure));
        }
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_4()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
""xxx 00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"",
""bc6402e37ad723580b576953f40475ceae4b784d3661b90c3c6f5a1f7283388a7880683e0821610bee977f70506bb75584080e01b2ec97483c4d601ce1c981752a07276b420d78594d0ef28f8ec016d0a5b6d56cfc22e9f25a2ed9545942ccbf2d6295b9528641d98776e06a3273ab233271a3c9f53099b4d4e029582a6d5819"")]

public class C
{
  static void Foo() {}
}",
1656
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithDelaySign(true).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1657 1658 1659 1660 1661 1662 1663 1664

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.False(success.Success);
            success.Diagnostics.Verify(
1665 1666
    // (3,1): error CS8003: Invalid signature public key specified in AssemblySignatureKeyAttribute.
    // "xxx 00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb",
P
Pilchie 已提交
1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684
    Diagnostic(ErrorCode.ERR_InvalidSignaturePublicKey, @"""xxx 00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb""")
                );
        }
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_5()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
""00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"",
""FFFFbc6402e37ad723580b576953f40475ceae4b784d3661b90c3c6f5a1f7283388a7880683e0821610bee977f70506bb75584080e01b2ec97483c4d601ce1c981752a07276b420d78594d0ef28f8ec016d0a5b6d56cfc22e9f25a2ed9545942ccbf2d6295b9528641d98776e06a3273ab233271a3c9f53099b4d4e029582a6d5819"")]

public class C
{
  static void Foo() {}
}",
1685
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithDelaySign(true).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.True(success.Success);
        }
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_6()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
null,
""bc6402e37ad723580b576953f40475ceae4b784d3661b90c3c6f5a1f7283388a7880683e0821610bee977f70506bb75584080e01b2ec97483c4d601ce1c981752a07276b420d78594d0ef28f8ec016d0a5b6d56cfc22e9f25a2ed9545942ccbf2d6295b9528641d98776e06a3273ab233271a3c9f53099b4d4e029582a6d5819"")]

public class C
{
  static void Foo() {}
}",
1709
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithDelaySign(true).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1710 1711 1712 1713 1714 1715 1716 1717

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.False(success.Success);
            success.Diagnostics.Verify(
1718 1719
    // (3,1): error CS8003: Invalid signature public key specified in AssemblySignatureKeyAttribute.
    // null,
P
Pilchie 已提交
1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737
    Diagnostic(ErrorCode.ERR_InvalidSignaturePublicKey, "null")
                );
        }
    }

    [Fact]
    public void AssemblySignatureKeyAttribute_7()
    {
        var other = CreateCompilation(
        @"
[assembly: System.Reflection.AssemblySignatureKeyAttribute(
""00240000048000009400000006020000002400005253413100040000010001002b986f6b5ea5717d35c72d38561f413e267029efa9b5f107b9331d83df657381325b3a67b75812f63a9436ceccb49494de8f574f8e639d4d26c0fcf8b0e9a1a196b80b6f6ed053628d10d027e032df2ed1d60835e5f47d32c9ef6da10d0366a319573362c821b5f8fa5abc5bb22241de6f666a85d82d6ba8c3090d01636bd2bb"",
null)]

public class C
{
  static void Foo() {}
}",
1738
  options: TestOptions.ReleaseDll.WithCryptoKeyFile(s_publicKeyFile).WithDelaySign(true).WithStrongNameProvider(s_defaultProvider), references: new[] { MscorlibRef_v4_0_30316_17626 });
P
Pilchie 已提交
1739 1740 1741 1742 1743 1744 1745 1746 1747 1748

        var tempFile = Temp.CreateFile();

        using (var outStrm = tempFile.Open())
        {
            var success = other.Emit(outStrm);
            Assert.True(success.Success);
        }
    }

1749
    [Fact, WorkItem(769840, "DevDiv")]
P
Pilchie 已提交
1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
    public void Bug769840()
    {
        var ca = CreateCompilationWithMscorlib(
@"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""Bug769840_B, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100458a131798af87d9e33088a3ab1c6101cbd462760f023d4f41d97f691033649e60b42001e94f4d79386b5e087b0a044c54b7afce151b3ad19b33b332b83087e3b8b022f45b5e4ff9b9a1077b0572ff0679ce38f884c7bd3d9b4090e4a7ee086b7dd292dc20f81a3b1b8a0b67ee77023131e59831c709c81d11c6856669974cc4"")]

internal class A
{
    public int Value = 3;
}
1760
", options: TestOptions.ReleaseDll.WithStrongNameProvider(s_defaultProvider), assemblyName: "Bug769840_A");
P
Pilchie 已提交
1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771

        CompileAndVerify(ca);

        var cb = CreateCompilationWithMscorlib(
@"
internal class B
{
    public A GetA()
    {
        return new A();
    }
1772 1773 1774 1775
}",
            options: TestOptions.ReleaseModule.WithStrongNameProvider(s_defaultProvider),
            assemblyName: "Bug769840_B",
            references: new[] { new CSharpCompilationReference(ca) });
P
Pilchie 已提交
1776

1777
        CompileAndVerify(cb, verify: false).Diagnostics.Verify();
P
Pilchie 已提交
1778 1779
    }

1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
    [Fact, WorkItem(1072350, "DevDiv")]
    public void Bug1072350()
    {
        const string sourceA = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""X "")]
internal class A
{
    internal static int I = 42;
}";

        const string sourceB = @"
class B
{
    static void Main()
    {
        System.Console.Write(A.I);
    }
}";

        var ca = CreateCompilationWithMscorlib(sourceA, options: TestOptions.ReleaseDll, assemblyName: "ClassLibrary2");
        CompileAndVerify(ca);

1802 1803
        var cb = CreateCompilationWithMscorlib(sourceB, options: TestOptions.ReleaseExe, assemblyName: "X", references: new[] { new CSharpCompilationReference(ca) });
        CompileAndVerify(cb, expectedOutput: "42", emitOptions: TestEmitters.CCI).Diagnostics.Verify();
1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827
    }

    [Fact, WorkItem(1072339, "DevDiv")]
    public void Bug1072339()
    {
        const string sourceA = @"
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""x"")]
internal class A
{
    internal static int I = 42;
}";

        const string sourceB = @"
class B
{
    static void Main()
    {
        System.Console.Write(A.I);
    }
}";

        var ca = CreateCompilationWithMscorlib(sourceA, options: TestOptions.ReleaseDll, assemblyName: "ClassLibrary2");
        CompileAndVerify(ca);

1828 1829
        var cb = CreateCompilationWithMscorlib(sourceB, options: TestOptions.ReleaseExe, assemblyName: "X", references: new[] { new CSharpCompilationReference(ca) });
        CompileAndVerify(cb, expectedOutput: "42", emitOptions: TestEmitters.CCI).Diagnostics.Verify();
1830
    }
P
Pilchie 已提交
1831

1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850
    [Fact, WorkItem(1095618, "DevDiv")]
    public void Bug1095618()
    {
        const string source = @"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(""System.Runtime.Serialization, PublicKey = 10000000000000000400000000000000"")]";

        var ca = CreateCompilationWithMscorlib(source);
        ca.VerifyDiagnostics(
            // (1,12): warning CS1700: Assembly reference 'System.Runtime.Serialization, PublicKey = 10000000000000000400000000000000' is invalid and cannot be resolved
            // [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Runtime.Serialization, PublicKey = 10000000000000000400000000000000")]
            Diagnostic(ErrorCode.WRN_InvalidAssemblyName, @"System.Runtime.CompilerServices.InternalsVisibleTo(""System.Runtime.Serialization, PublicKey = 10000000000000000400000000000000"")").WithArguments("System.Runtime.Serialization, PublicKey = 10000000000000000400000000000000").WithLocation(1, 12));

        var verifier = CompileAndVerify(ca, symbolValidator: module =>
        {
            var assembly = module.ContainingAssembly;
            Assert.NotNull(assembly);
            Assert.False(assembly.GetAttributes().Any(attr => attr.IsTargetAttribute(assembly, AttributeDescription.InternalsVisibleToAttribute)));
        });
    }

P
Pilchie 已提交
1851 1852
    #endregion
}