PowerShell调用C#生成的DLL类库
(转载本人之文)
本文以某网络文章为模板,结合自己的需要修改得到。自用备忘。
首先创建一个 C# 的控制台项目,注意修改输出为类库。
先创建一个类 SysInfo 这里有几个方法
点击查看代码
using System.Management;
using System.Security.Cryptography.X509Certificates;
namespace GetSysInfo
{
public class SysInfo
{
public string? CpuID; //1.cpu序列号
public string? MacAddress; //2.mac序列号
public string? DiskID; //3.硬盘id
public string? LoginUserName; //5.登录用户名
public SysInfo()
{
CpuID = GetCpuID();
MacAddress = GetMacAddress();
DiskID = GetDiskID();
LoginUserName = GetUserName();
}
public string OutputInfo()
{
SysInfo si = new();
return si.CpuID + "\n" + si.MacAddress + "\n" + si.DiskID + "\n" + si.LoginUserName;
}
public string GetCpuID()
{
try
{
string? cpuInfo = "";//cpu序列号
ManagementClass? mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection? moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
}
moc = null;
mc = null;
return cpuInfo;
}
catch
{
return "unknow";
}
finally
{
}
}
public string? GetMacAddress()
{
try
{
string? mac = "";
ManagementClass? mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection? moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
{
mac = mo["MacAddress"].ToString();
break;
}
}
moc = null;
mc = null;
return mac;
}
catch
{
return "unknow";
}
finally
{
}
}
public string GetDiskID()
{
try
{
String? HDid = "";
ManagementClass? mc = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection? moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
HDid = (string)mo.Properties["Model"].Value;
}
moc = null;
mc = null;
return HDid;
}
catch
{
return "unknow";
}
finally
{
}
}
public string GetUserName()
{
try
{
string? un = "";
un = Environment.UserName;
return un;
}
catch
{
return "unknow";
}
finally
{
}
}
public static string OutputSomething()
{
return "hello world!";
}
} //end of class
}
在命令行中输入pwsh进入powershell 7, 我验证发现 Windows自带的Powershell下面加载DLL不成功,可能是版本问题。
为了简单调用 GetSysInfo.dll 这个库,使用 Add-Type –Path 就可以输入 dll 的文件路径
Add-Type –Path "GetSysInfo.dll"
下面来告诉大家如何在 Powershell 创建 C# 类的对象
Powershell 创建 C# 类
可以使用下面代码创建 C# 类的对象, GetSysInfo为命名空间,SysInfo为类名
$obj = New-Object GetSysInfo.SysInfo
已经创建了类对象之后,再调用它的方法就可以了。 因为GetCpuID方法是Public的,可以被外部调用。
$obj.GetCpuID()
因为该方法返回了一个字串,因此命令行中就输出一个字串。
值得注意的是,如果你用Console.Writeln("xxyy")这样的形式输出了字串,但没有返回字串,则形式上命令行上有字符输出,但如果用管道传递的话,这种字串是无法传递后面的程序的(外观看起来一样,但实质不一样)。
Powershell 调用 C# 静态方法
在 C# 使用静态方法是不需要创建类,所以在 Powershell 就需要使用下面代码调用。
调用静态方法的方式是使用 [命名空间.类]::静态方法() 调用
注意运行 Powershell 脚本需要先添加策略,使用管理员权限运行下面代码(修改执行策略会带来安全隐患,如果不是开发者就不要使用.注意去除首尾的 `)
Set-ExecutionPolicy RemoteSigned
附上编译好的DLL:
顺便用命令将收集到的数据复制到文件中.
$obj.OutputInfo() | out-file "d:\Info.txt"