在C#中,extern
關(guān)鍵字用于聲明外部方法。這些方法通常是在非托管代碼(如C或C++代碼)中實(shí)現(xiàn)的,并通過P/Invoke(平臺(tái)調(diào)用)技術(shù)從C#代碼中調(diào)用。通過使用extern
關(guān)鍵字,您可以在C#中直接調(diào)用非托管函數(shù),而無需創(chuàng)建一個(gè)包含這些函數(shù)的DLL。
以下是使用C# extern
關(guān)鍵字相關(guān)的技術(shù)和概念:
DllImport
屬性來指定要調(diào)用的DLL的名稱以及要調(diào)用的函數(shù)的簽名。extern
關(guān)鍵字用于聲明一個(gè)外部方法。這意味著該方法的實(shí)現(xiàn)在非托管代碼中。當(dāng)C#代碼調(diào)用此方法時(shí),它將實(shí)際上調(diào)用非托管代碼中的對(duì)應(yīng)函數(shù)。DllImport
屬性是C#中的一個(gè)屬性,用于指定要調(diào)用的DLL的名稱以及要調(diào)用的函數(shù)的簽名。它通常與extern
關(guān)鍵字一起使用,以聲明一個(gè)外部方法。extern
關(guān)鍵字聲明的方法可以使用不同的調(diào)用約定。調(diào)用約定指定了如何傳遞參數(shù)以及如何在C#和非托管代碼之間返回值。常見的調(diào)用約定包括StdCall
、Cdecl
和FastCall
。extern
關(guān)鍵字聲明的方法必須具有與C#中其他方法相同的參數(shù)和返回值類型。但是,對(duì)于某些非托管語言,可能需要使用特定的數(shù)據(jù)類型來表示參數(shù)和返回值。在這種情況下,您可以使用DllImport
屬性中的CallingConvention
來指定適當(dāng)?shù)霓D(zhuǎn)換。以下是一個(gè)簡(jiǎn)單的示例,演示了如何使用C#中的extern
關(guān)鍵字和P/Invoke技術(shù)調(diào)用一個(gè)非托管函數(shù):
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()
{
// 調(diào)用非托管函數(shù)
int result = MessageBox(0, "Hello, World!", "Message Box", 0);
Console.WriteLine("Message Box returned " + result);
}
}
在這個(gè)示例中,我們聲明了一個(gè)名為MessageBox
的外部方法,該方法接受四個(gè)參數(shù)并返回一個(gè)整數(shù)。然后,我們?cè)?code>Main方法中使用MessageBox
函數(shù)顯示一個(gè)消息框。注意,我們使用DllImport
屬性指定了要調(diào)用的DLL的名稱(kernel32.dll
)以及調(diào)用約定(CallingConvention.Cdecl
)。