狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

c#創(chuàng)建、使用Dll動態(tài)鏈接庫

admin
2017年2月15日 10:49 本文熱度 6945

最近因為項目需要,需要調(diào)用一個動態(tài)鏈接庫,由于以前沒有接觸過,也不知道如何編寫調(diào)用DLL,特此記錄下學習筆記。


一、什么是DLL以及使用它的好處

1 DLL (DynamicLink Library )

DLL是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個應用程序可同時訪問內(nèi)存中單個DLL 副本的內(nèi)容。DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。(來自百度)

2 DLL的好處

1)當程序越來越龐大時,DLL避免了EXE文件的過大。分成DLL之后,不用把全部功能都集中到EXE里,需要的時候才調(diào)入內(nèi)存。
2)DLL模塊化了生產(chǎn)程序。DLL是產(chǎn)品,EXE就是個集裝箱。因此對DLL模塊的更新只需要替換此DLL文件即可,不用更新整個程序。
3)編譯EXE時,不用編譯DLL的內(nèi)容,加快了編譯速度。
4)DLL可重用。當一個DLL模式設計好之后,可以被其它項目或程序所引用。
5)DLL可以起到保密的作用。也就是說DLL可以將實現(xiàn)功能的源代碼隱藏起來,調(diào)用者只能使用而不能看到其內(nèi)部代碼。

上述可能說的有些難懂,下面是項目開發(fā)遇到的難題,其中就是選擇DLL連接庫,可以感性認識DLL的好處:

發(fā)生的背景

在開發(fā)新項目中使用了新的語言開發(fā)C#和新的技術方案WEB Service,但是在新項目中,一些舊的模塊需要繼續(xù)使用,一般是采用C或C++或Delphi編寫的,如何利用舊模塊對于開發(fā)人員來說,有三種可用方法供選擇:

第一、將C或C++函數(shù)用C#徹底改寫一遍,這樣整個項目代碼比較統(tǒng)一,維護也方便一些。但是盡管微軟以及某些書籍說,C#和C++如何接近,但是改寫起來還是很痛苦的事情,特別是C++里的指針和內(nèi)存操作;

第二、將C或C++函數(shù)封裝成COM,在C#中調(diào)用COM比較方便,只是在封裝時需要處理C或C++類型和COM類型之間的轉換,也有一些麻煩,另外COM還需要注冊,注冊次數(shù)多了又可能導致混亂;

第三、將C或C++函數(shù)封裝成動態(tài)鏈接庫,封裝的過程簡單,工作量不大。

因此我決定采用加載動態(tài)鏈接庫的方法實現(xiàn),于是產(chǎn)生了在C#中如何調(diào)用自定義的動態(tài)鏈接庫問題,我在網(wǎng)上搜索相關主題,發(fā)現(xiàn)一篇調(diào)用系統(tǒng)API的文章,但是沒有說明如何解決此問題,在MSDN上也沒有相關詳細說明。基于此,我決定自己從簡單出發(fā),逐步試驗,看看能否達到自己的目標。

“動態(tài)鏈接”這幾字指明了DLLs是如何工作的。對于常規(guī)的函數(shù)庫,鏈接器從中拷貝它需要的所有庫函數(shù),并把確切的函數(shù)地址傳送給調(diào)用這些函數(shù)的程序。而對于DLLs,函數(shù)儲存在一個獨立的動態(tài)鏈接庫文件中。在創(chuàng)建Windows程序時,鏈接過程并不把DLLs文件鏈接到程序上。直到程序運行并調(diào)用一個DLLs中的函數(shù)時,該程序才要求這個函數(shù)的地址。此時Windows才在DLLs中尋找被調(diào)用函數(shù),并把它的地址傳送給調(diào)用程序。采用這種方法,DLLs達到了復用代碼的極限。


二、在VS2010中如何創(chuàng)建和編寫DLL

方法很簡單,就是在程序的解決方案中添加一個項目,然后選擇“類庫”。注意,一定要在“解決方案”上添加項目才行,在項目中只能添加類文件了。類庫項目一但添加,在程序編譯的時候就會自動生成為DLL文件。

編寫DLL這和編寫類文件代碼是一致的。你可以在多個CS類文件中編寫,也可以全放在一起CS類文件中編寫。當然推薦的方式是根據(jù)功能分類將類庫分別寫在不同的CS文件中。(雖然在不同文件中,但同屬一個項目的類文件會被編譯進一個DLL庫文件中)


三、在VS2010中如何使用自己編寫的DLL

方法也很簡單,在你的程序中的解決方案管理器里,找到“引用”然后點右鍵添加,在彈出的對話框中選擇“瀏覽”,然后選擇你剛才創(chuàng)建并編譯過的DLL文件。然后在程序文件中使用using 來引入你DLL中的命名空間。注:如果DLL項目就在你當前的程序解決方案中,那么你可以直接在添加“引用”中選擇“項目”而不是“瀏覽”。這樣就可以直接引用本解決方案中編寫的DLL類庫。


上述都是文字描述,有興趣的需要嘗試自己編寫DLL并調(diào)用的同學可以參考

http://jingyan.baidu.com/article/6525d4b1091539ac7d2e9407.html,上面有最簡單的例程,我牛刀小試了一下,正確完成!


四.c#調(diào)用Matlab生成的DLL

1、創(chuàng)建一個簡單的.m文件

打開Matlab 2009a,新建一個.m文件,輸入如下代碼:

function result=twice(inputvar);
result=2*inputvar;

將代碼保存為twice.m文件,如圖所示。

image

2、使用Matlab DeployTool生成.Net組件

在Matlab 2009a的Command Window中輸入deploytool并回車,如圖所示。

image

就可以打開Matlab的DeployTool,如圖所示。

image

在DeployTool窗體中,點擊新建按鈕,打開新建項目對話框,如圖所示。

image

在左邊的列表中選擇MATLAB Builder NE,并在右邊的列表中選擇.NET Component,我們將這個工程命名為twice.prj,并點擊OK,則進入項目設置界面,如圖所示。

image

在Twice文件夾中添加我們剛才建好的.m文件,如圖所示。

image

點擊編譯按鈕或使用快捷鍵Ctrl+B則對該工程進行編譯。編譯完成后的主窗口如圖所示。

image

3、創(chuàng)建一個測試用的Windows應用程序,將其命名為MatlabTest,如圖所示。

image

4、添加對MWArray.dll的引用

MWArray.dll一般位于[Matlab安裝位置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夾中,我們注意到Matlab 2009a對應的MWArray.dll是2.9.0.0版本的。在進行Matlab版本升級的時候,比較頭疼的就是這個dll。

image

因為版本升級意味著之前生成的dll都需要重新生成。關于版本升級的問題,我將在后面的博文中詳細介紹。

之所以添加MWArray.dll,是因為在這種混合編程方式下,我們經(jīng)常要

using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.Net.Utility;

5、添加對Matlab生成的twice.dll的引用。

6、添加窗體中相應的組件。

添加一個Label控件,并修改其Text屬性為“計算結果”;

添加一個Label控件,用于顯示計算結果;

添加一個Button控件,用于執(zhí)行計算方法。

設計好后的Form1窗體如圖所示。

image

7、編寫相應的后臺代碼。

 

C#代碼 復制代碼 收藏代碼
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.ComponentModel;   
  4. using System.Data;   
  5. using System.Drawing;   
  6. using System.Text;   
  7. using System.Windows.Forms;   
  8. using MathWorks.MATLAB.NET.Arrays;   
  9. using twice;   
  10.     
  11. namespace MatlabTest   
  12. {   
  13.     public partial class Form1 : Form   
  14.     {   
  15.         public Form1()   
  16.         {   
  17.             InitializeComponent();   
  18.         }   
  19.     
  20.         private void button1_Click(object sender, EventArgs e)   
  21.         {   
  22.             int i = 5;   
  23.             Twice c = new Twice();   
  24.             MWArray result = c.twice((MWArray)i);   
  25.             this.label2.Text = result.ToString();   
  26.         }   
  27.     }   
  28. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using MathWorks.MATLAB.NET.Arrays;  
  9. using twice;  
  10.    
  11. namespace MatlabTest  
  12. {  
  13.     public partial class Form1 : Form  
  14.     {  
  15.         public Form1()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.    
  20.         private void button1_Click(object sender, EventArgs e)  
  21.         {  
  22.             int i = 5;  
  23.             Twice c = new Twice();  
  24.             MWArray result = c.twice((MWArray)i);  
  25.             this.label2.Text = result.ToString();  
  26.         }  
  27.     }  
  28. }  

8、執(zhí)行并查看結果

image

在代碼中輸入了一個變量i并為其賦值5,可以看到經(jīng)過調(diào)用Matlab計算,順利返回計算結果10。


五、創(chuàng)建和使用DLL

一個實例可以參考:http://blog.csdn.net/cpcpc/article/details/6134463

創(chuàng)建新的動態(tài)鏈接庫 (DLL) 項目

  1. “文件”菜單中,選擇“新建”,然后選擇“項目…”

  2. “項目類型”窗格中,選擇“Visual C++”下的“Win32”

  3. “模板”窗格中,選擇“Win32 控制臺應用程序”

  4. 為項目選擇一個名稱,如 MathFuncsDll,并將其鍵入“名稱”字段。為解決方案選擇一個名稱,如 DynamicLibrary,并將其鍵入“解決方案名稱”字段。

  5. 單擊“確定”啟動 Win32 應用程序向導。“Win32 應用程序向導”對話框的“概述”頁中,單擊“下一步”

  6. “Win32 應用程序向導”中的“應用程序設置”頁中,選擇“應用程序類型”下的“DLL”(如果可用),或者選擇“控制臺應用程序”(如果“DLL”不可用)。某���版本的 Visual Studio 不支持通過使用向導創(chuàng)建 DLL 項目。您可以稍后對此進行更改,以將項目編譯為 DLL。

  7. “Win32 應用程序向導”“應用程序設置”頁中,選擇“附加選項”下的“空項目”

  8. 單擊“完成”創(chuàng)建項目。

向動態(tài)鏈接庫添加類

  1. 若要為新類創(chuàng)建頭文件,請從“項目”菜單中選擇“添加新項…”將顯示“添加新項”對話框。“類別”窗格中,選擇“Visual C++”下的“代碼”“模板”窗格中選擇“頭文件(.h)”為頭文件選擇一個名稱,如 MathFuncsDll.h,并單擊“添加”將顯示一個空白文件。

  2. 添加一個名為“MyMathFuncs”的簡單類,以執(zhí)行常見的算術運算,如加、減、乘和除。代碼應與以下內(nèi)容類似:

    #ifdef MathFuncsDll_EXPORTS #define MathFuncsDll_API __declspec(dllexport) #else #define MathFuncsDll_API __declspec(dllimport) #endif // Windows 頭文件: #include       
  3.   // Returns a + b         extern "C" MathFuncsDll_API double Add(double a, double b);      
  4.    // Returns a - b         extern "C" MathFuncsDll_API double Subtract(double a, double b);    
  5.     // Returns a * b         extern "C" MathFuncsDll_API double Multiply(double a, double b);    
  6.      // Returns a / b      // Throws DivideByZeroException if b is 0         extern "C" MathFuncsDll_API double Divide(double a, double b);
  7. 請注意此代碼方法聲明中的 __declspec(dllexport) 修飾符。這些修飾符使 DLL 能夠導出該方法以供其他應用程序使用。有關更多信息,請參見 dllexport, dllimport

  8. 若要為新類創(chuàng)建源文件,請從“項目”菜單中選擇“添加新項…”將顯示“添加新項”對話框。“類別”窗格中,選擇“Visual C++”下的“代碼”“模板”窗格中,選擇“C++ 文件(.cpp)”為源文件選擇一個名稱,如 MathFuncsDll.cpp,并單擊“添加”將顯示一個空白文件。

  9. 在源文件中實現(xiàn)“MyMathFuncs”的功能。

代碼鏈接:http://download.csdn.net/source/2980458


更多關于DLL的調(diào)用可以參考:

http://blog.csdn.net/zlei2013141/article/details/6963524

http://bbs.ednchina.com/BLOG_ARTICLE_186713.HTM

http://blog.csdn.net/nocky/article/details/7687603



 更多,請關注:http://blog.csdn.net/tiandijun/,歡迎交流!


該文章在 2017/2/15 10:49:41 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved