在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
)。