C#調(diào)用非托管動態(tài)庫中的函數(shù)方法
C#如何調(diào)用一個非托管動態(tài)庫中的函數(shù)呢,比如用VC6寫的動態(tài)庫,總之C#調(diào)用動態(tài)庫的過程是比Java調(diào)用DLL動態(tài)庫方便快捷多了,下面舉例說明這個過程。
1、創(chuàng)建一個非托管動態(tài)庫
代碼如下:
//這一句是聲明動態(tài)庫輸出一個可供外不調(diào)用的函數(shù)原型.
extern "C" __declspec(dllexport) int add( int , int );
int add( int a, int b)
{
//實現(xiàn)這個函數(shù)returna+b;
}
注意上面代碼,一定要加上 extern"C" ,不能生成的動態(tài)庫中的導出函數(shù)名就不會是add,而是像 ?add@@YAHHH@Z 樣子,后面只是通過函數(shù)名 add 來定位函數(shù)入口就會出問題。
保存成C或者CPP文件都可以,接下來就用命令 cl (這個命令VC6提供) 來編譯生成一個動態(tài)庫,命令如下:
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盤根目錄下生成了你要的動態(tài)庫 MyLib.Dll ,還伴隨著生成了MyLib.lib、MyLib.obj、MyLib.exp文件,上面命令cl的參數(shù)/LD就是生成動態(tài)庫文件
2、編寫C#程序調(diào)用動態(tài)庫
using System;
using System.Runtime.InteropServices; //這是用到DllImport時候要引入的包
public class InvokeDll{
[DllImport( "MyLib.dll" , CharSet=CharSet.Auto)]
staticexternint add( int a, int b); //聲明外部的標準動態(tài)庫, 跟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
版權(quán)所有 (C) Microsoft Corporation 2001-2002。保留所有權(quán)利。
將生成Invokedll.exe, 可以執(zhí)行該文件.
C:\>InvokeDll
40
我們看到C#調(diào)用了非托管動態(tài)庫的函數(shù) add 。執(zhí)行前保證 MyLib.dll 在能夠被 InvokeDll 程序加載到的路徑上。
回過頭來,如果我們在MyLib.cpp中沒有加上 extern"C" 在,那么C中通過函數(shù)名 add 定位不到導出方法(因為函數(shù)名在動態(tài)庫中已經(jīng)變了),執(zhí)行invokeDll時就會出現(xiàn)如下錯誤。
C:\>InvokeDll
未處理的異常: System.EntryPointNotFoundException: 無法在 DLL MyLib.dll 中找到名為 add 的入口點。
at InvokeDll.add(Int32 a, Int32 b)
at InvokeDll.Main()
對于沒有加上 extern "C" 的函數(shù)原型生成的動態(tài)庫,我們就得用別的方式來調(diào)用了,具體怎么做,我現(xiàn)在還不知道。下面還有一個問題,上面的例子只是演示了動態(tài)庫中函數(shù)非常簡單的情況,如果函數(shù)傳遞的參數(shù)是指針,或者更復(fù)雜的數(shù)據(jù)類型,又如何操作呢?以后會深究的。
[注:]本文參考著網(wǎng)上一篇文章:C-Sharp調(diào)用標準動態(tài)庫 ,但是直接照著原文的操作就是會無法定位 add 的入口點的錯誤,所以略有修改。
相關(guān)文章
C#將PDF轉(zhuǎn)為多種圖像文件格式的方法(Png/Bmp/Emf/Tiff)
這里介紹將PDF轉(zhuǎn)換多種不同格式的圖像文件格式,如PNG,BMP,EMF,TIFF等,同時,轉(zhuǎn)換文檔也分為轉(zhuǎn)換全部文檔和轉(zhuǎn)換部分文檔為圖片兩種情況,本文也將作進一步介紹2018-02-02C#通過oledb訪問access數(shù)據(jù)庫的方法
這篇文章主要介紹了C#通過oledb訪問access數(shù)據(jù)庫的方法,實例分析了C#操作access數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-06-06數(shù)字金額大寫轉(zhuǎn)換器制作代碼分享(人民幣大寫轉(zhuǎn)換)
一個人民幣大寫的擴展方法,可以做成數(shù)字金額大寫轉(zhuǎn)換器,大家參考使用吧2013-12-12VS2010寫的程序在自己電腦可以運行、其他電腦上不能運行的解決方案
自己用Visual Studio 2010 旗艦版寫了一個軟件,在自己電腦上運行完全沒有問題,但是拷貝到其他人電腦上之后不管雙擊還是以管理身份運行,均沒有反應(yīng),進程管理器中相關(guān)進程也只是一閃而過2013-04-04