程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#程序集系列03,引用多個module,

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

編輯:C#入門知識

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


我們經常在項目中引用程序集。通常情況下,一個程序集包含一個module,但一個程序集也可以包含多個module。本篇就來體驗:在一個可以被編譯成.exe可執行文件的.cs文件中引用多個module。

 

□ 創建第一個module
→在前面2篇文章中,F盤的as文件夾中存放了若干程序集等文件。
→打開"VS2012開發人員命令提示",輸入如下命令,最終清空了F盤的as文件夾中的所有內容

→在F盤的as文件夾中創建MyFirstModule.cs,用記事本打開編寫如下代碼,並保存

using System;
class MyFirstModule
{
    public static void Hello()
    {
        Console.WriteLine("來自module 1的問候~");
    }
}

→在"VS2012開發人員命令提示",輸入如下命令,把類編譯成module,按回車

→輸入如下命令,發現F盤的as文件夾中多了一個MyFirstModule.netmodule文件

→輸入如下命令,反編譯生成的module,把module的IL代碼放到1.txt文件中查看,按回車

→輸入如下命令,打開1.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
}
.module MyFirstModule.netmodule
// MVID: {4403DD3C-6C5D-4AD7-AAD4-2929F36C0F4F}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x00440000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit MyFirstModule
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  Hello() cil managed
  {
    // 代碼大小       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      bytearray (65 67 EA 81 6D 00 6F 00 64 00 75 00 6C 00 65 00   // eg..m.o.d.u.l.e.
                                    20 00 31 00 84 76 EE 95 19 50 7E 00 )             //  .1..v...P~.
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method MyFirstModule::Hello
  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // 代碼大小       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method MyFirstModule::.ctor
} // end of class MyFirstModule

○ .assembly extern mscorlib,說明module用到了外部的mscorlib程序集
○ .module MyFirstModule.netmodule,表示modlue的名稱是MyFirstModule.netmodule
○ .class...,表示module中的類

 

□ 創建第二個module

→在F盤的as文件夾中創建MySecondModule.cs,用記事本打開編寫如下代碼,並保存

using System;
class MySecondModule
{
    public static void Hello()
    {
        Console.WriteLine("來自module 2的問候~");
    }
}

→在"VS2012開發人員命令提示",輸入如下命令,把類編譯成module,按回車

 

□ 引用多個module

→在F盤的as文件夾中創建MainClass.cs,用記事本打開編寫如下代碼,並保存

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

→輸入如下命令,編譯MainClass.cs,並引入2個module

→輸入如下命令,運行MainClass.exe

→輸入如下命令,反編譯MainClass.exe,把它的IL代碼呈現到2.txt文件中

→輸入如下命令,打開2.txt文件

// Metadata version: v4.0.30319
.module extern MyFirstModule.netmodule
.module extern MySecondModule.netmodule
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly MainClass
{
  .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 MainClass.exe
// MVID: {FD4741CB-DEDE-4D91-9B95-16DAF3CEB47E}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x003A0000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit MainClass
       extends [mscorlib]System.Object
{
  .method private hidebysig static void  Main() cil managed
  {
    .entrypoint
    // 代碼大小       14 (0xe)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  call       void [.module MyFirstModule.netmodule]MyFirstModule::Hello()
    IL_0006:  nop
    IL_0007:  call       void [.module MySecondModule.netmodule]MySecondModule::Hello()
    IL_000c:  nop
    IL_000d:  ret
  } // end of method MainClass::Main
  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // 代碼大小       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method MainClass::.ctor
} // end of class MainClass

○ .module extern MyFirstModule.netmodule,引用了MyFirstModule這個module
○ .module extern MySecondModule.netmodule,引用了MySecondModule這個module
○ .assembly extern mscorlib,引用了.NET默認程序集mscorlib
○ .assembly MainClass,代表本程序集
○ .module MainClass.exe,說明MainClass本身包含了一個名稱為MainClass.exe的module
○ .class...,表示程序集類

 

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

  C#程序集系列01,用記事本編寫C#,IL代碼,用DOS命令編譯程序集,運行程序

  C#程序集系列02,使用記事本查看可執行程序集的IL代碼

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

  C#程序集系列04,在程序集包含多個module的場景下理解關鍵字internal

  C#程序集系列05,讓程序集包含多個module

 

參考資料:

http://www.computersciencevideos.org/  created by Jamie King


C語言&& || !分別是什

&是取址運算符,作用是提取一個變量的地址。
比如你定義了一個變量,那麼在編譯時,系統就會在內存中分配一個空間。
而這個空間在內存中的位置就是它的地址。&就提取它的地址。
e.g int a;在編譯時就給它分配一個地址,比如是2000;&a就是2000。
假如先定義了一個整型指針變量p,p=&a;就是把a的地址2000賦給p。運行後p=2000。
又如scanf("%d",&a);當你輸入3時,它會先根據&a知道a的地址,由地址找到a在內存中的空間,再把3寫入這個空間。
*是指針運算符,作用與&相反,它是根據變量的地址取出變量的值。
比如,*a的值就是變量a的值3。
下面是定義和聲明中用到指針的小結
int *p; 定義一個指向整型數據的指針。
int *p[n]; 定義指針數組p,它由n個指向整型數據的指針元素組成。
int (*p)[n]; p為指向含n個元素的一維數組的指針變量。
int *p(); p為返回一個指針的函數,該指針指向整型數據。
int (*p)(); p為指向函數的指針,該函數返回一個整型值
int **p; p是一個指針變量,它指向一個指向整型數據的指針變量。
如果你想系統的了解建議你可以看看譚浩強的《c程序設計》(第三版)這本書通俗易懂。是學習c語言不錯的教材。
 

C語言&& || !分別是什

&是取址運算符,作用是提取一個變量的地址。
比如你定義了一個變量,那麼在編譯時,系統就會在內存中分配一個空間。
而這個空間在內存中的位置就是它的地址。&就提取它的地址。
e.g int a;在編譯時就給它分配一個地址,比如是2000;&a就是2000。
假如先定義了一個整型指針變量p,p=&a;就是把a的地址2000賦給p。運行後p=2000。
又如scanf("%d",&a);當你輸入3時,它會先根據&a知道a的地址,由地址找到a在內存中的空間,再把3寫入這個空間。
*是指針運算符,作用與&相反,它是根據變量的地址取出變量的值。
比如,*a的值就是變量a的值3。
下面是定義和聲明中用到指針的小結
int *p; 定義一個指向整型數據的指針。
int *p[n]; 定義指針數組p,它由n個指向整型數據的指針元素組成。
int (*p)[n]; p為指向含n個元素的一維數組的指針變量。
int *p(); p為返回一個指針的函數,該指針指向整型數據。
int (*p)(); p為指向函數的指針,該函數返回一個整型值
int **p; p是一個指針變量,它指向一個指向整型數據的指針變量。
如果你想系統的了解建議你可以看看譚浩強的《c程序設計》(第三版)這本書通俗易懂。是學習c語言不錯的教材。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved