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
}
上面创建的项目是 GetSysInfo ,项目就是准备调用刚才写的方法。将上述项目编译成GetSysInfo.dll,仅有6kb。为简化演示,将它复制到D:\

在命令行中输入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:

GetSysInfo.rar

顺便用命令将收集到的数据复制到文件中.

$obj.OutputInfo() | out-file "d:\Info.txt"

posted @ 2025-06-04 00:45  dingxianghuan  阅读(35)  评论(0)    收藏  举报