You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含抽象类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:55:21