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