C# / Windows Powershell  與 Powershell的差異

  • Post author:
  • Post category:C#

最近在研究Powershell

發現有2種版本,也不能說是版本,應該是種類

一種是根植於Windows,以 .NET Framework v4.5為架構的Windows Powershell 5.1

另一種是從 .NET Framework 移至 .NET Core架構 的Powershell 7.X

這又要回過來認識.NET的種類

  • .NET Framework — 原始的 .NET。 它提供對 Windows 和 Windows Server 的廣泛功能的存取。 在維護方面,它受到積極的支援。
  • Mono – 原始的社群和開放原始碼 .NET。 .NET Framework 的跨平台實作。 積極支援 Android、iOS 和 WebAssembly。
  • .NET (Core) — 新式 .NET。 .NET 的跨平台和開放原始碼實作,針對雲端時代進行了重新的思考,同時保持與 .NET Framework 的重要相容。 積極支援 Linux、macOS 和 Windows。

簡單的說就是時代技術的演變,從windows平台到跨平台的開發架構

因為使用到DLL,所以也會因為.NET Framework 跟.NET (Core)的差別而有所不同

所以現在有.NET Standard 來幫助建立跨版本架構的共用程式碼

綜上,如果要在Windows Powershell  與 Powershell都能夠運作的話

DLL要用.NET Standard 2.0的版本

以下用ClosedXML.dll作為說明

Powershell

ClosedXML-0.96.0版 .NETStandard 2.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Add-Type -Path "$PSScriptRoot\ClosedXML.dll"
Add-Type -Path "$PSScriptRoot\DocumentFormat.OpenXml.dll"
Add-Type -Path "$PSScriptRoot\System.IO.Packaging.dll"
Add-Type -Path "$PSScriptRoot\ExcelNumberFormat.dll"
Add-Type -Path "$PSScriptRoot\Microsoft.CSharp.dll"
Add-Type -Path "$PSScriptRoot\System.Drawing.Common.dll"

$workBook = New-Object ClosedXML.Excel.XLWorkbook

$workSheet = $workBook.Worksheets.Add("Sheet1")
$workSheet.Cell("A1").Value = "Hello world";
$workBook.SaveAs("$PSScriptRoot\helloworld2.xlsx")

$workSheet = $null
$workBook = $null

Windows Powershell

可能會因為架構的關係,所以引用DLL會產生問題

爬文之後的解決辦法是手動建立Reflection.Assembly

ClosedXML-0.80.0版 .NETFramework 4.6

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")            
$publish = New-Object System.EnterpriseServices.Internal.Publish            
$publish.GacInstall("$PSScriptRoot\ClosedXML.dll")
$publish.GacInstall("$PSScriptRoot\DocumentFormat.OpenXml.dll")

[Reflection.Assembly]::LoadFile("$PSScriptRoot\ClosedXML.dll")
[Reflection.Assembly]::LoadFile("$PSScriptRoot\DocumentFormat.OpenXml.dll")

$workBook = new-object ClosedXML.Excel.XLWorkbook
$workSheet = $workBook.Worksheets.Add("Sheet1")   
$worksheet.Cell("A1").Value = "Hello world";
$workBook.SaveAs("$PSScriptRoot\helloworld555.xlsx")

$publish.GacRemove("$PSScriptRoot\ClosedXML.dll")
$publish.GacRemove("$PSScriptRoot\DocumentFormat.OpenXml.dll")

 

ClosedXML-0.96.0版 .NETStandard 2.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")            
$publish = New-Object System.EnterpriseServices.Internal.Publish

$publish.GacInstall("$PSScriptRoot\ClosedXML.dll")
$publish.GacInstall("$PSScriptRoot\DocumentFormat.OpenXml.dll")
$publish.GacInstall("$PSScriptRoot\System.IO.Packaging.dll")
$publish.GacInstall("$PSScriptRoot\ExcelNumberFormat.dll")
$publish.GacInstall("$PSScriptRoot\Microsoft.CSharp.dll")
$publish.GacInstall("$PSScriptRoot\System.Drawing.Common.dll")

[Reflection.Assembly]::LoadFile("$PSScriptRoot\ClosedXML.dll")
[Reflection.Assembly]::LoadFile("$PSScriptRoot\DocumentFormat.OpenXml.dll")
[Reflection.Assembly]::LoadFile("$PSScriptRoot\System.IO.Packaging.dll")
[Reflection.Assembly]::LoadFile("$PSScriptRoot\ExcelNumberFormat.dll")
[Reflection.Assembly]::LoadFile("$PSScriptRoot\Microsoft.CSharp.dll")
[Reflection.Assembly]::LoadFile("$PSScriptRoot\System.Drawing.Common.dll")

$workBook = new-object ClosedXML.Excel.XLWorkbook
$workSheet = $workBook.Worksheets.Add("Sheet1")   
$worksheet.Cell("A1").Value = "Hello world";
$workBook.SaveAs("$PSScriptRoot\helloworld555.xlsx")

$publish.GacRemove("$PSScriptRoot\ClosedXML.dll")
$publish.GacRemove("$PSScriptRoot\DocumentFormat.OpenXml.dll")
$publish.GacRemove("$PSScriptRoot\System.IO.Packaging.dll")
$publish.GacRemove("$PSScriptRoot\ExcelNumberFormat.dll")
$publish.GacRemove("$PSScriptRoot\Microsoft.CSharp.dll")
$publish.GacRemove("$PSScriptRoot\System.Drawing.Common.dll")

 

可以看得出來 Windows Powershell  與 Powershell可以使用的DLL版本與對應的依賴(Dependencies)都不一樣

所以為了單純與共用,確實使用.NETStandard 2.0是比較方便的方式