gpt4 book ai didi

c# - 使用 PowerShell 在 c# 结构中设置值

转载 作者:太空狗 更新时间:2023-10-29 21:34:57 25 4
gpt4 key购买 nike

我已经将一些 DHCP Win32 Api 翻译成 C#,这样我就可以使用 PowerShell 中的:

$definition = @"
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Net;

namespace Dhcpsapi
{

public enum DHCP_SEARCH_INFO_TYPE : int
{
DhcpClientIpAddress = 0,
DhcpClientHardwareAddress = 1,
DhcpClientName = 2
};

[StructLayout(LayoutKind.Sequential)]
public struct DHCP_BINARY_DATA
{
public uint DataLength;
public IntPtr Data;
};

[StructLayout(LayoutKind.Sequential)]
public struct DHCP_IP_ADDRESS
{
public UInt32 IPAddress;
}

[StructLayout(LayoutKind.Explicit, Size=8)]
public struct SearchInfo
{
[FieldOffset(0)]
public DHCP_IP_ADDRESS ClientIpAddress;
[FieldOffset(0)]
public DHCP_BINARY_DATA ClientHardwareAddress;
[FieldOffset(0)]
public IntPtr ClientName; //LPWSTR
}

[StructLayout(LayoutKind.Sequential)]
public struct DHCP_SEARCH_INFO
{
public DHCP_SEARCH_INFO_TYPE SearchType;
public SearchInfo SearchInfo;
}

[StructLayout(LayoutKind.Sequential)]
public struct DATE_TIME
{
public UInt32 dwLowDateTime;
public UInt32 dwHighDateTime;

public DateTime ToDateTime()
{
if (dwHighDateTime == 0 && dwLowDateTime == 0)
{
return DateTime.MinValue;
}
if (dwHighDateTime == int.MaxValue && dwLowDateTime == UInt32.MaxValue)
{
return DateTime.MaxValue;
}
return DateTime.FromFileTime((((long)dwHighDateTime) << 32) | dwLowDateTime);
}
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DHCP_HOST_INFO
{
public uint IpAddress;
public string NetBiosName;
public string HostName;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DHCP_CLIENT_INFO
{
public uint ClientIpAddress;
public uint SubnetMask;
public DHCP_BINARY_DATA ClientHardwareAddress;
[MarshalAs(UnmanagedType.LPWStr)]
public string ClientName;
[MarshalAs(UnmanagedType.LPWStr)]
public string ClientComment;
public DATE_TIME ClientLeaseExpires;
public DHCP_HOST_INFO OwnerHost;
}

public static class PS
{

[DllImport("Dhcpsapi.dll")]
public static extern uint DhcpGetClientInfo(
[MarshalAs(UnmanagedType.LPWStr)]
string ServerIpAddress,
[MarshalAs(UnmanagedType.Struct)]
ref DHCP_SEARCH_INFO SearchInfo,
out IntPtr ClientInfo);

[DllImport("dhcpsapi.dll", SetLastError=true)]
public static extern void DhcpRpcFreeMemory(IntPtr BufferPointer);
}
}
"@

Add-Type -TypeDefinition $definition -PassThru

现在我尝试在 PowerShell 中使用它:

$dsi = New-Object dhcpsapi.DHCP_SEARCH_INFO
$dsi.SearchType = [Dhcpsapi.DHCP_SEARCH_INFO_TYPE]::DhcpClientIpAddress
$ipa = [System.Net.IPAddress]::Parse("10.4.3.101")
$ip = [UInt32][System.Net.IPAddress]::NetworkToHostOrder([int][System.BitConverter]::ToUInt32($ipa.GetAddressBytes(), 0))

# $ip is now 168035173
$dsi.SearchInfo.ClientIpAddress.IPAddress = $ip

#however $dsi.SearchInfo.ClientIpAddress.IPAddress is 0
$dsi.SearchInfo.ClientIpAddress.IPAddress

运行后 $dsi.SearchInfo.ClientIpAddress.IPAddress 是 0 而不是我预期的 168035173。为什么会发生这种情况(它按 C# 的预期工作)以及如何让它工作?

最佳答案

SearchInfo 是一个结构,所以当您这样做时:

#however $dsi.SearchInfo.ClientIpAddress.IPAddress is 0
$dsi.SearchInfo.ClientIpAddress.IPAddress

然后您将创建 SearchInfo 的副本,并且该副本的值正在发生变化。对于每个结构,您需要改变结构,然后将其分配回去:

$clientIpAddress = $dsi.SearchInfo.ClientIpAddress
$clientIpAddress.IPAddress = $ip

$searchInfo = $dsi.SearchInfo
$searchInfo.ClientIpAddress = $clientIpAddress

$dsi.SearchInfo = $searchInfo

关于c# - 使用 PowerShell 在 c# 结构中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13161286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com