内容简介:PowerShell 不僅僅是一種腳本語言,還是一個可執行命令列的 Shell 工具,而他也和其他 Shell 一樣可以透過撰寫腳本來執行很複雜的功能,但有時候我們已經有大量用 C# 撰寫好的類別庫,或者想要用熟悉的 C# 程式碼來擴充 PowerShell 的使用情境時,這裡提供兩種讓你在 PowerShell 中執行 C# 程式的方法。PowerShell 提供了
PowerShell 不僅僅是一種腳本語言,還是一個可執行命令列的 Shell 工具,而他也和其他 Shell 一樣可以透過撰寫腳本來執行很複雜的功能,但有時候我們已經有大量用 C# 撰寫好的類別庫,或者想要用熟悉的 C# 程式碼來擴充 PowerShell 的使用情境時,這裡提供兩種讓你在 PowerShell 中執行 C# 程式的方法。
直接寫程式碼進行載入
PowerShell 提供了 Add-Tpye
命令, 這個命令 的用途在於將 Microsoft .NET Framework 或 .NET Core 的類別載入 PowerShell 執行階段中。
Add-Type
有可以參數可以直接接收 C# 程式碼,使用方式基本如下:
$Assemblies = ( <# 要加入參考組件 #> ) $CSharpCode = @"要執行的 C# 程式碼"@ Add-Type -ReferencedAssemblies $Assemblies -TypeDefinition $CSharpCode -Language CSharp # 上述執行後,執行命令的方法 [Namespace.ClassName]::MethodName()
上面建立了兩個變數,分別是要程式碼需要的參考,以及要執行的程式碼本身,接著透過 Add-Type -ReferencedAssemblies $Assemblies -TypeDefinition $CSharpCode -Language CSharp
將該程式載入到 PowerShell 執行階段使用。
實際使用範例
如同上述所提的做法,我們將程式碼加上去。
PowerShell 預設會參考 System.dll
和 System.Management.Automation.dll
這兩個組件,若你會用到其他組件時,才需要額外指定下述 $Assemblies
變數的內容值。
$Assemblies = ( "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL", "System.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" ) $CSharpCode = @" using System; using System.Linq; namespace PSLib { public static class HelloWorld { public static void Say(string name) { Console.Write("Hello World, " + name); } public static void LinqRange(int max) { var squares = Enumerable.Range(1, max).Select(i => i * i); foreach (var num in squares) { Console.Write(num + "\t"); } } } } "@ Add-Type -ReferencedAssemblies $Assemblies -TypeDefinition $CSharpCode -Language CSharp
一個常見的問題是,該如何取得組件的描述,可以 參考這篇 ,主要透過 Visual Studio 的開發人員命令提示字元,使用 gacutil -l
命令就可以取得本機全域組件快取的組件清單。
執行後我們就可以有下面兩個命令可以執行:
# 可執行命令 [PSLib.HelloWorld]::Say() [PSLib.HelloWorld]::LinqRange(600)
透過載入 DLL 執行
上面的方式看似方便,其實有點不好維護,畢竟要寫純文字的程式碼,有點難寫。
另一種方式相對方便,做法是在 Visual Studio 或 Visual Studio Code 中寫好程式,編譯成 DLL 後,在 PowerShell 中載入該 DLL 並呼叫其方法,看看以下作法。
建立 DLL
開啟你習慣使用的 C# 程式碼編輯器,這裡我用 Visual Studio 建立 類別庫專案 ,並新增 HelloWorld.cs 檔,然後同樣使用上面的程式碼。
建置後會得到一顆 PSLib.dll
DLL 組件檔案。
載入 DLL 至 PowerShell
這裡我們建立一個資料夾,並將剛剛建置得到的 DLL 檔複製進來,接著建立 ExecuteCSharpDLL.ps1
檔,程式碼如下:
你可以透過 Write-Host
命令來查看變數值,例如: Write-Host $PSLib
。
$CurrentLocation = Get-Location $PSLib = "$CurrentLocation\PSLib.dll" $Dlls = ( $PSLib ) Add-Type -LiteralPath $Dlls
這是透過 Add-Type
命令並指定要載入的 DLL 絕對路定,這裡的 $Dlls
會是個字串陣列,讓我們可以一次載入多個 DLL 組件,透過這樣的方式來將程式碼載入到 PowerShell 執行階段中。
如此一來我們就可以透過以下方式來執行該 DLL 中所提供的方法,用法如下:
# 可執行命令 [PSLib.HelloWorld]::Say("Poy Chang") [PSLib.HelloWorld]::LinqRange(10)
這樣是不是大大提高了使用的彈性,並且可以讓我們使用熟悉的 C# 來擴充功能。
替代作法
上面有提到 PowerShell 預設會載入 System.dll
,因此我們也可以使用 Reflection
反射的方式來載入 DLL 組件,用法如下:
$CurrentLocation = Get-Location $PSLib = "$CurrentLocation\PSLib.dll" # 載入指定檔案路徑的 DLL 檔 [Reflection.Assembly]::LoadFile($PSLib)
重點在最後一行,透過 [Reflection.Assembly]::LoadFile()
方法,將絕對路徑的 DLL 檔載入到 PowerShell 執行階段中。
後記
嚴格來說,這裡提供了 3 種載入組件或程式碼的方法,個人是比較偏好使用 Add-Type -LiteralPath <String[]>
這種方法,一來簡潔,二來所提供的彈性更大,以上在 Powershell 中執行 C# 程式碼或 DLL 檔的方法,分享給大家。
參考資料:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 佈署 Angular 應用程式至 IIS 虛擬目錄 / 應用程式
- 佈署 Angular 應用程式至 IIS 虛擬目錄 / 應用程式
- matlab—方程式求根
- 八、Golang过程式编程
- 如何降低程式碼複雜度 ?
- 算法系列(1):Google方程式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP Web 2.0开发实战
泽瓦斯 / 苏金国 / 人民邮电出版社 / 2008-10-1 / 59.00元
本书通过一个完整的Web 2.0应用——带有动态图库、搜索和地图功能的博客系统详细介绍了Web开发的全过程。首先讨论了Web应用的规划与设计,然后逐章实现各个具体特性,包括网站主页、用户主页、用户注册页面、账户登录和管理页面、用户博客系统、网站搜索以及应用管理等,最后介绍部署和维护。 本书适合中、高级的PHP程序员阅读。一起来看看 《PHP Web 2.0开发实战》 这本书的介绍吧!