標籤:io os 使用 ar 檔案 資料 sp on log
使用csc命令將.cs檔案編譯成.dll的過程
很多時候,我們需要將.cs檔案單獨編譯成.dll檔案, 操作如下:
開啟命令視窗->輸入cmd到控制台->cd C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
轉到vs.net安裝的該目錄下->執行csc命令csc /target:library File.cs->在該目錄下產生一個對應名字的.dll檔案(前提:把.cs檔案放到C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322目錄下)
csc命令的方式很多,請參考以下
譯 File.cs 以產生 File.exe
csc File.cs 編譯 File.cs 以產生 File.dll
csc /target:library File.cs 編譯 File.cs 並建立 My.exe
csc /out:My.exe File.cs 通過使用最佳化和定義 DEBUG 符號,編譯目前的目錄中所有的 C# 檔案。輸出為 File2.exe
csc /define:DEBUG /optimize /out:File2.exe *.cs 編譯目前的目錄中所有的 C# 檔案,以產生 File2.dll 的調試版本。不顯示任何徽標和警告
csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs 將目前的目錄中所有的 C# 檔案編譯為 Something.xyz(一個 DLL)
csc /target:library /out:Something.xyz *.cs 編譯 File.cs 以產生 File.dll
csc /target:library File.cs這個就是我們使用最多的一個命令,其實可以簡單的寫成csc /t:library File.cs,另外的一個寫法是 csc /out:mycodebehind.dll /t:library mycodebehind.cs,這個可以自己指定輸出的檔案名稱。
csc /out:mycodebehind.dll /t:library mycodebehind.cs mycodebehind2.cs,這個的作用是把兩個cs檔案裝到一個.dll檔案裡
csc不是內部或外部命令,也不是可啟動並執行程式解決方案
針對VisualStudio2005
1:右鍵點擊"我的電腦"--"屬性"--"進階"--"環境變數"--"系統變數"
將PATH中加上路徑:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
2:直接在dos環境的cs相應檔案夾目錄執行
Path=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
3:VisualStudio2005命令提示
開始--》程式---》Microsoft Visual Studio2005---->Visual Studio Tools--->VisualStudio2005命令提示
把cs檔案copy到C:\Program Files\Microsoft Visual Studio 8\VC\
4:C:\autoexec.bat
加入:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
vs2008 下
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ 裡的CSC.EXE 是2.0版本
編譯的.cs檔案如果帶using System.Linq;編譯通不過,如果不用LINQ文法刪除using System.Linq;即可,否則 調用C:\WINDOWS\Microsoft.NET\Framework\v3.5裡的CSC.EXE
同一SLN下 裡面 class 直接存取類庫。
封裝到DLL。 匯入DLL 添加using namespace 工有才能訪問。
一、 動態連結程式庫
什麼是動態連結程式庫?DLL三個字母對於你來說一定很熟悉吧,它是Dynamic Link Library 的縮寫形式,動態連結程式庫 (DLL) 是作為共用函數庫的可執行檔。動態連結提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的進程分開儲存的函數。DLL 還有助於共用資料和資源。多個應用程式可同時訪問記憶體中單個 DLL 副本的內容。
和大多數程式員一樣,你一定很使用過DLL吧。也曾感受到它的帶給你程式設計和編碼上的好錯吧今天我想和大家探討一個主題:如何在C#建立和調用DLL(動態連結程式庫), 其實在很大意義上而講,DLL讓我更靈活的組織編寫我們的應用程式,作為軟體設計者,可一個根據它來達到很高的代碼重用效果。下面我來介紹一下在C#中如何建立和調用DLL。
二、準備工作
我們需要對我們接下來要做的事情做個簡單的介紹,在本文我們將利用C#語言建立一個名為 MyDLL.DLL的動態連結程式庫,在這個動態連結程式庫檔案中我們將提供兩個功能一個是對兩個參數交換他們的值,另一個功能是求兩個參數的最大公約數。然後建立一個應用程式使用這個DLL。運行並輸出結果。
三、建立DLL
讓我們建立以下三個C#代碼檔案:
1、 MySwap.cs
view plaincopy to clipboardprint?
using System;
namespace MyMethods
{
public class SwapClass
{
public static bool Swap(ref long i,ref long j)
{
i = i+j;
j = i-j;
i = i-j;
return true;
}
}
}
using System;
namespace MyMethods
{
public class SwapClass
{
public static bool Swap(ref long i,ref long j)
{
i = i+j;
j = i-j;
i = i-j;
return true;
}
}
}
2、MyMaxCD.cs
view plaincopy to clipboardprint?
using System;
namespace MyMethods
{
public class MaxCDClass
{
public static long MaxCD(long i, long j)
{
long a,b,temp;
if(i>j)
{
a = i;
b = j;
}
else
{
b = i;
a = j;
}
temp = a % b;
while(temp!=0)
{
a = b;
b = temp;
temp = a % b;
}
return b;
}
}
}
using System;
namespace MyMethods
{
public class MaxCDClass
{
public static long MaxCD(long i, long j)
{
long a,b,temp;
if(i>j)
{
a = i;
b = j;
}
else
{
b = i;
a = j;
}
temp = a % b;
while(temp!=0)
{
a = b;
b = temp;
temp = a % b;
}
return b;
}
}
}
需要注意的是:我們在製作這兩個檔案的時候可以用Visual Studio.NET或者其他的文字編輯器,就算是記事本也可以。這兩個檔案雖然不在同一個檔案裡面,但是他們是屬於同一個namespace(名稱空間)這對以後我們使用這兩個方法提供了方便。當然他們也可以屬於不同的名稱空間,這是完全可以的,但只是在我們應用他們的時候就需要引用兩個不同的名稱空間,所以作者建議還是寫在一個名稱空間下面比較好。
接下來的任務是把這兩個cs檔案變成我們需要的DLL檔案。方法是這樣的:在安裝了Microsoft.NET Framework的作業系統上,我們可以在Windows所在目錄下找到Microsoft.NET目錄。在這個目錄下面提供了C#的編譯器,CSC.EXE運行:csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs,完成後可在本目錄下面找到我們剛才產生的MyDLL.DLL檔案/target:library 編譯器選項通知編譯器輸出 DLL 檔案而不是 EXE 檔案。後跟檔案名稱的 /out 編譯器選項用於指定 DLL 檔案名稱。如果/out後面不跟檔案名稱編譯器使用第一個檔案 (MySwap.cs) 作為 DLL 檔案名稱。產生的檔案為MySwap.DLL檔案。
OK!我們建立動態連結程式庫檔案的任務完成了,現在是我們享受勞動成果的時候了,下面我將介紹如何使用我們所建立的動態連結程式庫檔案。 四、使用DLL 我們簡單寫一個小程式來測試一下我們剛才寫的兩個方法是否正確,好吧,跟我來:
MyClient.cs
view plaincopy to clipboardprint?
using System;
using MyMethods; //這裡我們引用剛才定義的名稱空間,如果剛才的兩個檔案我們寫在兩個不同的名稱空間
class MyClient
{
public static void Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: MyClient <num1> <num2>");
return;
}
long num1 = long.Parse(args[0]);
long num2 = long.Parse(args[1]);
SwapClass.Swap(ref num1,ref num2);
// 請注意,檔案開頭的 using 指令使您得以在編譯時間使用未限定的類名來引用 DLL 方法
Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1, num2);
long maxcd = MaxCDClass.MaxCD(num1,num2);
Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);
}
}
using System;
using MyMethods; //這裡我們引用剛才定義的名稱空間,如果剛才的兩個檔案我們寫在兩個不同的名稱空間
class MyClient
{
public static void Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: MyClient <num1> <num2>");
return;
}
long num1 = long.Parse(args[0]);
long num2 = long.Parse(args[1]);
SwapClass.Swap(ref num1,ref num2);
// 請注意,檔案開頭的 using 指令使您得以在編譯時間使用未限定的類名來引用 DLL 方法
Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1, num2);
long maxcd = MaxCDClass.MaxCD(num1,num2);
Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);
}
}
若要產生可執行檔 MyClient.exe,請使用以下命令列:
csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs
/out 編譯器選項通知編譯器輸出 EXE 檔案並且指定輸出檔案名 (MyClient.exe)。/reference 編譯器選項指定該程式所引用的 DLL 檔案。
五、執行
若要運行程式,請輸入 EXE 檔案的名稱,檔案名稱的後面跟兩個數字,例如:MyClient 123 456
六、輸出
The result of swap is num1 = 456 and num2 = 123
The MaxCD of 456 and 123 is 3
七、小結
動態連結具有下列優點:
1、節省記憶體和減少交換操作。很多進程可以同時使用一個 DLL,在記憶體中共用該 DLL 的一個副本。相反,對於每個用靜態連結庫產生的應用程式,Windows 必須在記憶體中載入庫代碼的一個副本。
2、節省磁碟空間。許多應用程式可在磁碟上共用 DLL 的一個副本。相反,每個用靜態連結庫產生的應用程式均具有作為單獨的副本連結到其可執行映像中的庫代碼。 3、升級到 DLL 更為容易。DLL 中的函數更改時,只要函數的參數和傳回值沒有更改,就不需重新編譯或重新連結使用它們的應用程式。相反,靜態連結的對象代碼要求在函數更改時重新連結應用程式。
4、提供售後支援。例如,可修改顯示器驅動程式 DLL 以支援當初交付應用程式時停用顯示器。
5、支援多語言程式。只要程式遵循函數的呼叫慣例,用不同程式設計語言編寫的程式就可以調用相同的 DLL 函數。程式與 DLL 函數在下列方面必須是相容的:函數期望其參數被推送到堆棧上的順序,是函數還是應用程式負責清理堆棧,以及寄存器中是否傳遞了任何參數。
6、提供了擴充 MFC 庫類的機制。可以從現有 MFC 類衍生類別,並將它們放到 MFC 擴充 DLL 中供 MFC 應用程式使用。
7、使國際版本的建立輕鬆完成。通過將資源放到 DLL 中,建立應用程式的國際版本變得容易得多。可將用於應用程式的每個語言版本的字串放到單獨的 DLL 資源檔中,並使不同的語言版本載入合適的資源。
使用 DLL 的一個潛在缺點是應用程式不是獨立的;它取決於是否存在單獨的 DLL 模組
C#產生DLL檔案