C#調(diào)用非托管dll的兩種方式詳解
示例DLL
首先,我們有一個Delphi編寫的DLL,它導(dǎo)出了一個名為MyFunction的方法:
library testDLL;
uses
SysUtils,
Dialogs,
Classes;
{$R *.res}
function MyFunction(param1: Integer): Integer; stdcall;
begin
Result := param1 + 1;
end;
exports
MyFunction;
begin
end.
方式一:直接調(diào)用
這是最常見的調(diào)用方式,通過DllImport屬性直接導(dǎo)入非托管方法。
[DllImport("testDLL.dll")]
static extern int MyFunction(int a);
然后,你可以直接調(diào)用這個方法:
int i = MyFunction(123);
方式二:使用本地委托
另一種方法是將非托管方法轉(zhuǎn)換為本地委托。這種方式更靈活,但需要更多的代碼。
輔助方法
首先,我們需要一些輔助方法來加載和卸載DLL:
// 輔助方法:加載DLL
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LoadLibrary(string lpFileName);
// 輔助方法:卸載DLL
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeLibrary(IntPtr hModule);
// 獲取方法指針
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
定義委托
接下來,定義一個與DLL中方法參數(shù)一致的委托:
public delegate int MyFunctionDelphiDelegate(int param1);
使用委托調(diào)用方法
最后,使用委托來調(diào)用非托管方法:
void run()
{
// 加載DLL
IntPtr dllHandle = LoadLibrary("testDLL.dll");
if (dllHandle == IntPtr.Zero)
{
var err = Marshal.GetHRForLastWin32Error();
}
// 獲取方法指針
IntPtr functionPointer = GetProcAddress(dllHandle, "MyFunction");
MyFunctionDelphiDelegate my = (MyFunctionDelphiDelegate)Marshal.GetDelegateForFunctionPointer(functionPointer, typeof(MyFunctionDelphiDelegate));
// 調(diào)用方法
int i = my(1);
// 釋放DLL
FreeLibrary(dllHandle);
}
注意事項
- 位數(shù)一致性:確保你的程序和DLL的位數(shù)(32位或64位)保持一致。
- 字符串參數(shù):Delphi方法中的參數(shù)和返回值如果是字符串,不能直接使用
String類型。需要使用PAnsiChar或PChar,并搭配StrNew使用。 - 返回值:如果方法返回值為字符串,需要使用
IntPtr類型,并通過Marshal.PtrToStringAnsi(strIntPtr)來獲取實際的字符串值。
通過這兩種方式,你可以靈活地在C#中調(diào)用非托管的DLL庫,滿足不同的開發(fā)需求。
到此這篇關(guān)于C#調(diào)用非托管dll的兩種方式詳解的文章就介紹到這了,更多相關(guān)C#調(diào)用非托管dll內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?基于NAudio實現(xiàn)對Wav音頻文件剪切(限PCM格式)
本文主要介紹了C#基于NAudio工具對Wav音頻文件進行剪切,可以將一個音頻文件剪切成多個音頻文件(限PCM格式),感興趣的小伙伴可以學(xué)習一下2021-11-11
C#面向?qū)ο笤O(shè)計原則之組合/聚合復(fù)用原則
這篇文章介紹了C#面向?qū)ο笤O(shè)計原則之組合/聚合復(fù)用原則,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
使用C#代碼實現(xiàn)拆分PowerPoint演示文稿
PowerPoint 演示文稿是各類工作和交流中常用的重要工具,本文介紹了如何在 .NET 環(huán)境中使用 C# 拆分 PowerPoint 演示文稿,文章的示例代碼講解詳細,有需要的小伙伴可以參考下2026-05-05
C#實現(xiàn)將PPT文檔轉(zhuǎn)換為PDF格式的三種方法
本文介紹了使用C#實現(xiàn)PPT轉(zhuǎn) PDF 的三種實用方法,包括單個文件轉(zhuǎn)換,批量轉(zhuǎn)換以及加密 PDF 轉(zhuǎn)換,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2026-01-01
C#編程:List.ForEach與foreach循環(huán)的對比分析
這篇文章主要介紹了C#編程:List.ForEach與foreach循環(huán)的對比分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
.Net WInform開發(fā)筆記(二)Winform程序運行結(jié)構(gòu)圖及TCP協(xié)議在Winform中的應(yīng)用
中午沒事,把去年剛畢業(yè)那會畫的幾張圖翻出來了,大概介紹Winform應(yīng)用程序運行的過程,以及TCP協(xié)議在Winform中的應(yīng)用。感興趣的朋友可以了解下;如果有Windows消息機制等基礎(chǔ),很好理解這兩張2013-01-01

