C#中的訪問修飾符internal可以使類型在同程序集中可以被相互訪問。但有時會有這樣一個要求,我們希望一個程序集中的類型可以被外部的某些程序集訪問,如果設置成public的話,就被所有的外部程序集訪問;或是在單元測試中,測試代碼在另一個程序集中運行,但需要訪問正在測試的標記為internal的程序集中的成員。要達到上述要求我們可以使用有元程序集。
看例子:
我是在D盤上新建了一個“friend Assembly”文件夾,把所有的文件(.dll、.cs、.exe)都放在裡面。

1. 新建一個類庫,friend_unsigned_A.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
//friend_unsigned_A.cs
//Compile with
//csc/target:library friend_unsigned_A.cs
[assembly: InternalsVisibleTo ("friend_unsigned_B")] //定義friend_unsigned_B為有元程序集
namespace friend_unsigned_A
{
//Type is internal by default
class Class1
{
public void Test()
{
Console.WriteLine("Class1.Test");
}
}
//Public type with internal member
public class Class2
{
internal void Test()
{
Console.WriteLine("Class2.Test");
}
}
}
2. 打開VS開發人員命令行,csc /target:library friend_unsigned_A.cs

3. 新建一個控制台應用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using friend_unsigned_A; //不要忘記添加命名空間
// friend_unsigned_B.cs
// Compile with:
// csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs
namespace friend_unsigned_B
{
class Program
{
static void Main(string[] args)
{
// Access an internal type.
Class1 inst1 = new Class1();
inst1.Test();
Class2 inst2 = new Class2();
// Access an internal member of a public type.
inst2.Test();
System.Console.ReadLine();
}
}
}
4. 輸入命令行
csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs

5. 直接運行 friend_unsigned_B.exe
