我正在试验C#和PowerShell.在PowerShell文件中创建一个C#类、实例化它并使用它非常简单,如下面的代码所示:

$code = @"
using System;
public abstract class Transporter : IDisposable
{
    public abstract void Transport(Order order);

    public void Dispose()
    {
        // Suppress finalization.
        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");
    }
}

"@
# use it!
Add-Type -TypeDefinition $code -Language CSharp 
$order = [Order]::new()
$order.Distance = 200
$order.Urgent=$false
$highway = [HighwayTransporter]::new()
$highway.Transport($order)

现在,我想将类定义导出到一个单独的文件,类似于PowerShell模块.然而,我遇到了一个挑战,因为我使用的是PowerShell不熟悉的抽象类定义.try 将类定义放在函数中并将其另存为模块(例如,myCSharpModule.psm1),然后导入该模块似乎行不通.如何才能做到这一点?

推荐答案

可以将类定义放在脚本模块文件.psm1中(对于Import-Module的按需导入),as long as you also include the 101 call.

下面是一个最小的例子:

# Create a sample script module that compiles a minimal class definition.
@'
Add-Type '
public class Foo { public int Bar() { return 42; } }
'
'@ > sample.psm1

# Import the sample module.
Import-Module -Force ./sample.psm1

# Make use of the class
[Foo]::new().Bar() # -> 42

注:

  • 在你的情况下,你并不严格需要module分:

    • 您可以直接调用一个常规的.ps1脚本文件.

    • 你甚至可以save your C# code stand-alone as a regular 100 file and compile and load it on demand with 101:

      • 正如mclayton所指出的,这为您提供了在编辑器中突出显示C#语法的好处.

      • 在一个会话中重复进行这样的调用是有益的--您只会在first调用中招致编译性能损失.

      • 但是,相反,如果文件的内容发生了变化,并且您希望加载新代码,则需要启动new session,原因如下所述.

  • 通常的限制适用于已加载到会话中的.NET程序集(无论是从file(.dll)程序集还是从dynamically crated程序集加载,就像现在的情况一样):

    • 由.NET程序集公开的公共类型在所有范围内都是session-globally可见的.

    • 此类类型在加载后不能从会话中保留为removed,因为.NET程序集无法卸载.

    • 因此,要加载基于C#的类定义的modified版本,您需要启动一个新会话.

Csharp相关问答推荐

当Visual Studio处于升级管理模式时,无法安装Torch运行时

try 还原包时出错:Dapper已经为System.Data.SQLClient定义了依赖项''''

如何使用while循环实现异常处理

如何从HttpContext获取请求正文

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

如何注册接口类型,类型<>

如何在Parall.ForEachAsync中使用CancerationTokenSource

Quartz调度程序不调用作业(job)类

Take()方法如何与IAsyncEnumerable一起使用

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

异步等待Foreach循环中的ConfigureAWait(FALSE)执行什么操作?

如何更改新创建的实例的变量?

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

WPF:如何从DatagridHeader的内容模板绑定到词典项

将两个for循环更改为一条LINQ语句

使用C#代码和SQL SERVER中的相同证书签名会产生不同的结果

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到

CsvHelper在第二次迭代时抛出System.ObjectDisposedException

C#、Visual Studio代码、调试器、错误处理变量请求.未知错误:0x80131502,