您的位置:首页 > 编程语言 > C#

C#程序集系列04,在程序集包含多个module的场景下理解关键字internal

2014-09-12 14:48 232 查看
本篇在一个程序集包含多个module的场景下体验internal的含义。

→查看F盘as文件夹下的文件



→删除MainClass.exe



→把MyFirstModule和MySecondModule组装到一个程序集中去



现在,MyDll.dll程序集中包含了2个module。
→反编译,把MyDLL.dll的IL代码显示到3.txt文件中



→打开3.txt文件




// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
.ver 4:0:0:0
}
.assembly MyDll
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.file MyFirstModule.netmodule
.hash = (2F 9D 95 85 6E F4 D2 CA 50 61 C0 9F A1 58 C6 5F   // /...n...Pa...X._
5D 1D 96 4B )                                     // ]..K
.file MySecondModule.netmodule
.hash = (28 72 47 EE 2E 76 45 AA 6B 87 17 93 6B 4F 1C 5D   // (rG..vE.k...kO.]
84 D8 07 CB )
.module MyDll.dll
// MVID: {DDC0023A-A0C5-4E28-8352-13288A2E427D}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x00400000
// *********** 反汇编完成 ***********************
// 警告: 创建了 Win32 资源文件 3.res

○ .assembly extern mscorlib,引用了.NET默认程序集
○ .assembly MyDll,表示MyDll程序集本身
○ .file MyFirstModule.netmodule,说明MyDll程序集引用了MyFirstModule这个module
○ .file MySecondModule.netmodule, 说明MyDll程序集引用了MySecondModule这个module
○ .module MyDll.dll,MyDll程序集包含了一个名称为MyDll.dll的module

→重新编译MainClass.cs文件,并引用新生成的、包含2个module的MyDll.dll程序集




报错了,为什么?
--因为在定义MyFristModule类和MySecondModule类的时候,虽然在class前面没有修饰的关键字,但默认是internal
--internal意味着程序集的方法只能被该程序集调用,不能被外部程序集调用

当在MainClass.cs中调用MyFirstModule和MySecondModule的Hello方法

using System;
class MainClass
{
static void Main()
    {
MyFirstModule.Hello();
MySecondModule.Hello();
    }
}

虽然MyFirstModule和MySecondModule已经被包含在MyDll.dll程序集了,但Hello方法不属于MyDll.dll程序集,依然属于MyFirstModule和MySecondModule。






总结:internal关键字修饰的类,其内部的方法只能被本程序集调用,不能被外部程序集调用。



“C#程序集系列”包括:

C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序

C#程序集系列02,使用记事本查看可执行程序集的IL代码

C#程序集系列03,引用多个module

C#程序集系列04,在程序集包含多个module的场景下理解关键字internal

C#程序集系列05,让程序集包含多个module

C#程序集系列06,程序集清单,EXE和DLL的区别

C#程序集系列07,篡改程序集

C#程序集系列08,设置程序集版本

C#程序集系列09,程序集签名

C#程序集系列10,强名称程序集

C#程序集系列11,全局程序集缓存

C#程序集系列12,C#编译器和CLR如何找寻程序集

C#程序集系列13,如何让CLR选择不同版本的程序集

参考资料:

http://www.computersciencevideos.org/ created by Jamie King
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: