如何将含抽象类的C#类导入PowerShell并封装为模块?
如何将带抽象类的C#类型封装为PowerShell模块?
要实现将包含抽象类的C#类型封装为可复用的PowerShell模块,核心是让模块在导入时自动加载C#类型,无需手动触发。具体步骤如下:
1. 创建PowerShell模块文件
新建文件myCSharpModule.psm1,将C#类型定义和Add-Type命令直接放在模块的顶级作用域中,不要将其包裹在函数内部。模块加载时会自动执行顶级代码,完成C#类型的全局注册。
模块文件内容示例:
$code = @" using System; public abstract class Transporter : IDisposable { public abstract void Transport(Order order); public void Dispose() { GC.SuppressFinalize(this); } } public class Order { public int Distance { get; set; } public bool Urgent { get; set; } } public class SeawayTransporter : Transporter { public override void Transport(Order order) { Console.WriteLine("The order transported by SeawayTransporter"); } } public class AirwayTransporter : Transporter { public override void Transport(Order order) { Console.WriteLine("The order transported by AirwayTransporter"); } } public class HighwayTransporter : Transporter { public override void Transport(Order order) { Console.WriteLine("The order transported by HighwayTransporter"); } } "@ # 加载C#类型到当前PowerShell会话 Add-Type -TypeDefinition $code -Language CSharp
2. 导入模块并使用类型
在PowerShell会话中导入模块后,即可直接实例化并使用这些C#类:
# 根据实际路径导入模块 Import-Module .\myCSharpModule.psm1 # 实例化并调用类型 $order = [Order]::new() $order.Distance = 200 $order.Urgent = $false $highway = [HighwayTransporter]::new() $highway.Transport($order)
为什么之前的函数封装方式无效?
如果将Add-Type逻辑放在函数内部,模块导入后并不会自动执行该函数,必须手动调用函数才会触发类型加载。而将代码放在模块顶级作用域,模块导入时就会自动执行Add-Type,完成类型注册,无需额外操作。
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

