最近在研究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是比較方便的方式