C# 引用DLL的3種方式[靜態連結, 動態連結, 專案參考]
C# 引用DLL的3種方式
C#引用DLL的方式有
- 靜態連結(Static Linking)
- 動態連結(Dynamic Linking)
- 專案參考(Project Reference)
以下將說明運作原理、優/缺點...
靜態連結
- 運作原理, 靜態連結是將DLL編譯進應用程式的執行檔,使得應用程式與DLL的程式碼合併在一個執行檔中
- 優點: 執行速度較快,無需額外的DLL檔案
- 缺點: 更新DLL時,必須重新編譯應用程式
- 編譯時整合: DLL的程式碼在編譯時期被整合進入應用程式的執行檔
- 執行檔: 應用程式執行檔包含了所有必要的程式碼,無需額外的DLL檔案
- 應用範圍: 適用於相對較小且不經常更新的專案。若DLL需要更新,則必須重新編譯整個應用程式
- 部署方式: 部署時只需將單一執行檔複製到目標機器上,不需要額外的DLL
// 使用DllImportAttribute進行靜態連結
using System.Runtime.InteropServices;
class Program
{
// 声明 DLL 文件的路径
const string dllPath = "YourDll.dll";
// 声明 DLL 中的函数
[DllImport(dllPath)]
public static extern int YourFunction();
static void Main()
{
// 调用 DLL 中的函数
int result = YourFunction();
Console.WriteLine($"Result from DLL: {result}");
}
}
動態連結
- 運作原理, 在執行時期,應用程式會動態載入DLL,並使用其功能, 使用 System.Reflection 或其他方法動態調用 DLL 中的函數
- 優點: 更新DLL不需要重新編譯應用程式
- 缺點: 需要確保DLL存在於執行目錄或系統路徑
- 編譯時整合: DLL的程式碼在編譯時期並未整合進應用程式,僅在執行時期動態載入
- 執行檔: 應用程式執行檔不包含DLL程式碼,需要確保DLL存在於執行目錄或系統路徑
- 應用範圍: 適用於需要彈性更新DLL的專案,更新時只需替換DLL檔案即可,不需重新編譯應用程式
- 部署方式: 部署時需要確保DLL與執行檔在同一目錄下,或者將DLL複製至系統路徑
class Program
{
static void Main()
{
// 動態載入 DLL
Assembly assembly = Assembly.LoadFile("YourDll.dll");
// 根據 DLL 中的類別或函數名稱動態調用
Type type = assembly.GetType("YourNamespace.YourClass");
MethodInfo method = type.GetMethod("YourFunction");
// 創建類別的實例
object instance = Activator.CreateInstance(type);
// 調用函數
int result = (int)method.Invoke(instance, null);
Console.WriteLine($"Result from DLL: {result}");
}
}
專案參考
- 運作原理, 在同一個解決方案中的專案之間建立參考關係,無需額外的DLL檔案
- 優點: 編譯時期就能夠進行錯誤檢查,易於管理
- 缺點: 若要在其他應用程式中使用,必須將整個專案一併複製
- 編譯時整合: 應用程式在編譯時期參考專案,但不將專案的程式碼整合進執行檔,而是動態連結
- 執行檔: 應用程式執行檔本身不包含DLL的程式碼,而是在執行時期需要使用
- 應用範圍: 適用於大型專案,易於管理,且在需要時能夠動態參考其他專案
- 部署方式: 部署時需要確保執行檔與所需的DLL檔案在同一目錄下,或者將所需DLL複製至系統路徑
// 在同一個解決方案中的專案中建立參考
// 在需要使用的地方直接使用命名空間和類別
using YourLibraryNamespace;
class Program
{
static void Main()
{
YourClass.YourMethod();
}
}
留言
張貼留言