在C#中,extern
關鍵字用于聲明外部方法。這些方法通常是在非托管代碼(如C或C++代碼)中實現的,并通過P/Invoke(平臺調用)技術從C#代碼中調用。通過使用extern
關鍵字,您可以在C#中直接調用非托管函數,而無需創建一個包含這些函數的DLL。
以下是使用C# extern
關鍵字相關的技術和概念:
DllImport
屬性來指定要調用的DLL的名稱以及要調用的函數的簽名。extern
關鍵字用于聲明一個外部方法。這意味著該方法的實現在非托管代碼中。當C#代碼調用此方法時,它將實際上調用非托管代碼中的對應函數。DllImport
屬性是C#中的一個屬性,用于指定要調用的DLL的名稱以及要調用的函數的簽名。它通常與extern
關鍵字一起使用,以聲明一個外部方法。extern
關鍵字聲明的方法可以使用不同的調用約定。調用約定指定了如何傳遞參數以及如何在C#和非托管代碼之間返回值。常見的調用約定包括StdCall
、Cdecl
和FastCall
。extern
關鍵字聲明的方法必須具有與C#中其他方法相同的參數和返回值類型。但是,對于某些非托管語言,可能需要使用特定的數據類型來表示參數和返回值。在這種情況下,您可以使用DllImport
屬性中的CallingConvention
來指定適當的轉換。以下是一個簡單的示例,演示了如何使用C#中的extern
關鍵字和P/Invoke技術調用一個非托管函數:
using System;
using System.Runtime.InteropServices;
class Program
{
// 聲明外部方法
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int MessageBox(int hWnd, string lpText, string lpCaption, int uType);
static void Main()
{
// 調用非托管函數
int result = MessageBox(0, "Hello, World!", "Message Box", 0);
Console.WriteLine("Message Box returned " + result);
}
}
在這個示例中,我們聲明了一個名為MessageBox
的外部方法,該方法接受四個參數并返回一個整數。然后,我們在Main
方法中使用MessageBox
函數顯示一個消息框。注意,我們使用DllImport
屬性指定了要調用的DLL的名稱(kernel32.dll
)以及調用約定(CallingConvention.Cdecl
)。