国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#調用非托管動態庫中的函數方法

2020-01-24 02:08:59
字體:
來源:轉載
供稿:網友

C#如何調用一個非托管動態庫中的函數呢,比如用VC6寫的動態庫,總之C#調用動態庫的過程是比Java調用DLL動態庫方便快捷多了,下面舉例說明這個過程。

1、創建一個非托管動態庫

代碼如下:

復制代碼 代碼如下:

   //這一句是聲明動態庫輸出一個可供外不調用的函數原型. 
   extern   "C"  __declspec(dllexport)  int  add( int ,  int ); 

   int  add( int  a, int  b)  
   { 
        //實現這個函數returna+b; 
   }


注意上面代碼,一定要加上 extern"C" ,不能生成的動態庫中的導出函數名就不會是add,而是像 ?add@@YAHHH@Z 樣子,后面只是通過函數名 add 來定位函數入口就會出問題。

保存成C或者CPP文件都可以,接下來就用命令 cl (這個命令VC6提供) 來編譯生成一個動態庫,命令如下:

復制代碼 代碼如下:

C:/>cl /LD MyLib.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

MyLib.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:MyLib.dll
/dll
/implib:MyLib.lib
MyLib.obj
Creating library MyLib.lib and object MyLib.exp


可以看到在C盤根目錄下生成了你要的動態庫 MyLib.Dll ,還伴隨著生成了MyLib.lib、MyLib.obj、MyLib.exp文件,上面命令cl的參數/LD就是生成動態庫文件

2、編寫C#程序調用動態庫

復制代碼 代碼如下:

   using  System; 
   using  System.Runtime.InteropServices; //這是用到DllImport時候要引入的包 
   public   class  InvokeDll{ 

       [DllImport( "MyLib.dll" , CharSet=CharSet.Auto)] 
       staticexternint add( int  a, int  b); //聲明外部的標準動態庫, 跟Win32API是一樣. 

        public   static   void  Main() 
       { 
         Console.WriteLine(add(10,30)); 
       } 
   }


保存為InvokeDll.cs文件, 與MyLib.dll置于同一目錄, 編譯該文件.
復制代碼 代碼如下:

C:/>csc InvokeDll.cs
Microsoft (R) Visual C# .NET 編譯器版本 7.10.3052.4
用于 Microsoft (R) .NET Framework 版本 1.1.4322
版權所有 (C) Microsoft Corporation 2001-2002。保留所有權利。
將生成Invokedll.exe, 可以執行該文件.

C:/>InvokeDll
40


我們看到C#調用了非托管動態庫的函數 add 。執行前保證 MyLib.dll 在能夠被 InvokeDll 程序加載到的路徑上。

回過頭來,如果我們在MyLib.cpp中沒有加上 extern"C" 在,那么C中通過函數名 add 定位不到導出方法(因為函數名在動態庫中已經變了),執行invokeDll時就會出現如下錯誤。

復制代碼 代碼如下:

C:/>InvokeDll

未處理的異常: System.EntryPointNotFoundException: 無法在 DLL MyLib.dll 中找到名為 add 的入口點。
at InvokeDll.add(Int32 a, Int32 b)
at InvokeDll.Main()


對于沒有加上 extern "C" 的函數原型生成的動態庫,我們就得用別的方式來調用了,具體怎么做,我現在還不知道。下面還有一個問題,上面的例子只是演示了動態庫中函數非常簡單的情況,如果函數傳遞的參數是指針,或者更復雜的數據類型,又如何操作呢?以后會深究的。

[注:]本文參考著網上一篇文章:C-Sharp調用標準動態庫 ,但是直接照著原文的操作就是會無法定位 add 的入口點的錯誤,所以略有修改。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定安县| 神农架林区| 海南省| 增城市| 锦州市| 桐柏县| 汉源县| 石泉县| 扶余县| 会泽县| 丰镇市| 潞城市| 洛宁县| 道真| 武川县| 台安县| 衢州市| 渭南市| 永清县| 牙克石市| 房产| 黄浦区| 明光市| 衡阳县| 静乐县| 宾川县| 常宁市| 双桥区| 瓮安县| 西乌| 城市| 昆山市| 绥棱县| 元阳县| 贵南县| 荥阳市| 福泉市| 抚宁县| 襄城县| 宝坻区| 寿阳县|