C# - 如何封送 LPWSTR 数组

作者:编程家 分类: arrays 时间:2025-09-27

封送 LPWSTR 数组的C#方法详解

在C#编程中,封送(Marshalling)是一种将托管代码和非托管代码之间进行数据交换的重要技术。当你需要在C#中与C或C++等非托管语言进行交互时,经常需要进行数据的封送,特别是涉及到字符串数组时。本文将介绍如何在C#中封送LPWSTR(Unicode字符串)数组,并提供详细的案例代码。

### 1. LPWSTR 的基本概念

在Windows API编程中,LPWSTR是指向以双字节表示的Unicode字符串的指针。LPWSTR的全称是"Long Pointer to Wide String",其中"Long Pointer"表示指针的长度。在C#中,我们可以使用`[MarshalAs(UnmanagedType.LPWStr)]`特性来告诉运行时如何封送字符串。

### 2. 封送 LPWSTR 数组的基本步骤

封送LPWSTR数组涉及以下基本步骤:

#### 2.1 声明包含LPWSTR的结构

首先,我们需要声明一个结构,其中包含LPWSTR数组。使用`MarshalAs`特性确保正确的封送。

csharp

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

public struct MyStruct

{

[MarshalAs(UnmanagedType.LPWStr)]

public string[] myStringArray;

}

#### 2.2 封送数据

使用`Marshal`类的相关方法,将数据从托管代码封送到非托管代码。

csharp

MyStruct myStruct = new MyStruct();

myStruct.myStringArray = new string[] { "Hello", "World" };

IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MyStruct)));

Marshal.StructureToPtr(myStruct, structPtr, false);

### 3. 示例代码

下面是一个完整的示例,演示如何封送LPWSTR数组。

csharp

using System;

using System.Runtime.InteropServices;

public class Program

{

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

public struct MyStruct

{

[MarshalAs(UnmanagedType.LPWStr)]

public string[] myStringArray;

}

public static void Main()

{

MyStruct myStruct = new MyStruct();

myStruct.myStringArray = new string[] { "Hello", "World" };

IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MyStruct)));

Marshal.StructureToPtr(myStruct, structPtr, false);

// 在这里可以使用 structPtr 与非托管代码进行交互

Marshal.FreeHGlobal(structPtr);

}

}

### 4.

封送LPWSTR数组是C#中与非托管代码进行交互时的常见任务。通过使用`MarshalAs`特性和`Marshal`类,我们能够有效地在托管代码和非托管代码之间传递Unicode字符串数组。上述示例提供了一个简单而完整的框架,可供在实际项目中进行扩展和应用。