阅读量:0
在C#中,extern
关键字用于声明外部方法。这些方法通常是在非托管代码(如C或C++代码)中实现的,并通过P/Invoke(平台调用)技术从C#代码中调用。通过使用extern
关键字,您可以在C#中直接调用非托管函数,而无需创建一个包含这些函数的DLL。
以下是使用C# extern
关键字相关的技术和概念:
- P/Invoke(平台调用):P/Invoke是Platform Invocation Services的缩写。它允许C#代码调用非托管代码(如C或C++库中的函数)。为了使用P/Invoke,您需要在C#代码中使用
DllImport
属性来指定要调用的DLL的名称以及要调用的函数的签名。 - extern关键字:在C#中,
extern
关键字用于声明一个外部方法。这意味着该方法的实现在非托管代码中。当C#代码调用此方法时,它将实际上调用非托管代码中的对应函数。 - DLLImport属性:
DllImport
属性是C#中的一个属性,用于指定要调用的DLL的名称以及要调用的函数的签名。它通常与extern
关键字一起使用,以声明一个外部方法。 - 调用约定:在C#中,通过
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
)。