Bagikan melalui


Add-Type

Menambahkan kelas Microsoft .NET ke sesi PowerShell.

Sintaks

Add-Type
   [-TypeDefinition] <String>
   [-Language <Language>]
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   [-Name] <String>
   [-MemberDefinition] <String[]>
   [-Namespace <String>]
   [-UsingNamespace <String[]>]
   [-Language <Language>]
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   [-Path] <String[]>
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   -LiteralPath <String[]>
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   -AssemblyName <String[]>
   [-PassThru]
   [<CommonParameters>]

Deskripsi

Add-Type Cmdlet memungkinkan Anda menentukan kelas Microsoft .NET Core di sesi PowerShell Anda. Anda kemudian dapat membuat instans objek, dengan menggunakan New-Object cmdlet, dan menggunakan objek sama seperti Anda akan menggunakan objek .NET Core apa pun. Jika Anda menambahkan Add-Type perintah ke profil PowerShell, kelas tersedia di semua sesi PowerShell.

Anda dapat menentukan jenis dengan menentukan file kode rakitan atau sumber yang ada, atau Anda dapat menentukan kode sumber sebaris atau disimpan dalam variabel. Anda bahkan hanya dapat menentukan metode dan Add-Type menentukan dan menghasilkan kelas. Di Windows, Anda dapat menggunakan fitur ini untuk melakukan panggilan Platform Invoke (P/Invoke) ke fungsi yang tidak dikelola di PowerShell. Jika Anda menentukan kode sumber, Add-Type kompilasi kode sumber yang ditentukan dan hasilkan rakitan dalam memori yang berisi jenis .NET Core baru.

Anda dapat menggunakan parameter Add-Type untuk menentukan bahasa dan kompilator alternatif, C# adalah default, opsi pengkompilasi, dependensi rakitan, namespace kelas, nama jenis, dan rakitan yang dihasilkan.

Dimulai di PowerShell 7, Add-Type tidak mengkompilasi jenis jika tipe dengan nama yang sama sudah ada. Selain itu, Add-Type cari rakitan dalam ref folder di bawah folder yang berisi pwsh.dll.

Contoh

Contoh 1: Menambahkan jenis .NET ke sesi

Contoh ini menambahkan kelas BasicTest ke sesi dengan menentukan kode sumber yang disimpan dalam variabel. Kelas BasicTest digunakan untuk menambahkan bilangan bulat, membuat objek, dan mengalikan bilangan bulat.

$Source = @"
public class BasicTest
{
  public static int Add(int a, int b)
    {
        return (a + b);
    }
  public int Multiply(int a, int b)
    {
    return (a * b);
    }
}
"@

Add-Type -TypeDefinition $Source
[BasicTest]::Add(4, 3)
$BasicTestObject = New-Object BasicTest
$BasicTestObject.Multiply(5, 2)

Variabel $Source menyimpan kode sumber untuk kelas . Jenis ini memiliki metode statis yang disebut Add dan metode non-statis yang disebut Multiply.

Add-Type Cmdlet menambahkan kelas ke sesi. Karena menggunakan kode sumber sebaris, perintah menggunakan parameter TypeDefinition untuk menentukan kode dalam $Source variabel.

Metode Add statis kelas BasicTest menggunakan karakter titik dua (::) untuk menentukan anggota statis kelas. Bilangan bulat ditambahkan dan jumlah ditampilkan.

New-Object Cmdlet membuat instans kelas BasicTest. Ini menyimpan objek baru dalam $BasicTestObject variabel.

$BasicTestObjectMultiply menggunakan metode . Bilangan bulat dikalikan dan produk ditampilkan.

Contoh 2: Memeriksa jenis tambahan

Contoh ini menggunakan Get-Member cmdlet untuk memeriksa objek yang Add-Type dibuat cmdlet dan New-Object dalam Contoh 1.

[BasicTest] | Get-Member

TypeName: System.RuntimeType

Name                 MemberType Definition
----                 ---------- ----------
AsType               Method     type AsType()
Clone                Method     System.Object Clone(), System.Object ICloneable.Clone()
Equals               Method     bool Equals(System.Object obj), bool Equals(type o)
FindInterfaces       Method     type[] FindInterfaces(System.Reflection.TypeFilter filter...
...

[BasicTest] | Get-Member -Static

TypeName: BasicTest

Name            MemberType Definition
----            ---------- ----------
Add             Method     static int Add(int a, int b)
Equals          Method     static bool Equals(System.Object objA, System.Object objB)
new             Method     BasicTest new()
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object objB)

$BasicTestObject | Get-Member

TypeName: BasicTest

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
Multiply    Method     int Multiply(int a, int b)
ToString    Method     string ToString()

Get-Member Cmdlet mendapatkan jenis dan anggota kelas BasicTest yang Add-Type ditambahkan ke sesi. Perintah mengungkapkan Get-Member bahwa itu adalah objek System.RuntimeType , yang berasal dari kelas System.Object .

Parameter Get-Member Statis mendapatkan properti statis dan metode kelas BasicTest . Output menunjukkan bahwa Add metode disertakan.

Get-Member Cmdlet mendapatkan anggota objek yang disimpan dalam $BasicTestObject variabel. $BasicTestObject dibuat dengan menggunakan New-Object cmdlet dengan kelas BasicTest . Output mengungkapkan bahwa nilai $BasicTestObject variabel adalah instans kelas BasicTest dan bahwa itu termasuk anggota yang disebut Multiply.

Contoh 3: Menambahkan jenis dari rakitan

Contoh ini menambahkan kelas dari JsonSchema.NET.dll rakitan ke sesi saat ini.

Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru

Set-Locationmenggunakan parameter Jalur untuk menentukan $PSHOME variabel. Variabel mereferensikan direktori penginstalan PowerShell tempat file DLL berada.

Variabel $AccType menyimpan objek yang dibuat dengan Add-Type cmdlet. Add-Typemenggunakan parameter AssemblyName untuk menentukan nama rakitan. Karakter kartubebas tanda bintang (*) memungkinkan Anda untuk mendapatkan rakitan yang benar bahkan ketika Anda tidak yakin dengan nama atau ejaannya. Parameter PassThru menghasilkan objek yang mewakili kelas yang ditambahkan ke sesi.

Contoh 4: Memanggil WINDOWS API asli

Contoh ini menunjukkan cara memanggil API Windows asli di PowerShell. Add-Type menggunakan mekanisme Platform Invoke (P/Invoke) untuk memanggil fungsi User32.dll dari PowerShell. Contoh ini hanya berfungsi pada komputer yang menjalankan sistem operasi Windows.

$Signature = @"
[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@

$addTypeSplat = @{
    MemberDefinition = $Signature
    Name = "Win32ShowWindowAsync"
    Namespace = 'Win32Functions'
    PassThru = $true
}
$ShowWindowAsync = Add-Type @addTypeSplat

# Minimize the PowerShell console

$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 2)

# Restore the PowerShell console

$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $Pid).MainWindowHandle, 4)

Variabel $Signature menyimpan tanda tangan C# fungsi ShowWindowAsync . Untuk memastikan bahwa metode yang dihasilkan terlihat dalam sesi PowerShell, public kata kunci ditambahkan ke tanda tangan standar. Untuk informasi selengkapnya, lihat Fungsi ShowWindowAsync .

Variabel $ShowWindowAsync menyimpan objek yang dibuat oleh Add-Type parameter PassThru . Add-Type Cmdlet menambahkan ShowWindowAsync fungsi ke sesi PowerShell sebagai metode statis. Perintah menggunakan parameter MemberDefinition untuk menentukan definisi metode yang $Signature disimpan dalam variabel. Perintah menggunakan parameter Nama dan Namespace untuk menentukan nama dan namespace untuk kelas. Parameter PassThru menghasilkan objek yang mewakili jenis.

Metode statis baru ShowWindowAsync digunakan dalam perintah untuk meminimalkan dan memulihkan konsol PowerShell. Metode ini mengambil dua parameter: handel jendela, dan bilangan bulat yang menentukan bagaimana jendela ditampilkan.

Untuk meminimalkan konsol Get-Process PowerShell, ShowWindowAsync gunakan cmdlet dengan $PID variabel otomatis untuk mendapatkan proses yang menghosting sesi PowerShell saat ini. Kemudian menggunakan properti MainWindowHandle dari proses saat ini dan nilai 2, yang mewakili SW_MINIMIZE nilai .

Untuk memulihkan jendela, ShowWindowAsync menggunakan nilai 4 untuk posisi jendela, yang mewakili SW_RESTORE nilai .

Untuk memaksimalkan jendela, gunakan nilai 3 yang mewakili SW_MAXIMIZE.

Parameter

-AssemblyName

Menentukan nama rakitan yang menyertakan jenis. Add-Type mengambil jenis dari rakitan yang ditentukan. Parameter ini diperlukan saat Anda membuat jenis berdasarkan nama rakitan.

Masukkan nama lengkap atau sederhana, juga dikenal sebagai nama parsial, dari rakitan. Karakter kartubebas diizinkan dalam nama rakitan. Jika Anda memasukkan nama sederhana atau parsial, Add-Type menyelesaikannya ke nama lengkap, lalu menggunakan nama lengkap untuk memuat rakitan.

Menggunakan parameter Path atau LiteralPath menjamin bahwa Anda memuat assembly yang ingin Anda muat. Saat Anda menggunakan parameter AssemblyName , PowerShell meminta .NET untuk menyelesaikan nama rakitan menggunakan proses resolusi rakitan .NET standar. Karena .NET mencari folder aplikasi terlebih dahulu, Add-Type mungkin memuat assembly dari $PSHOME bukan versi di folder saat ini. Untuk informasi selengkapnya, lihat Lokasi perakitan.

Jika .NET gagal mengatasi nama, PowerShell kemudian mencari di lokasi saat ini untuk menemukan rakitan. Saat Anda menggunakan kartubebas dalam parameter AssemblyName , proses resolusi rakitan .NET gagal menyebabkan PowerShell terlihat di lokasi saat ini.

Jenis:String[]
Alias:AN
Position:Named
Nilai default:None
Diperlukan:True
Terima input alur:False
Terima karakter wildcard:True

-CompilerOptions

Menentukan opsi untuk pengkompilasi kode sumber. Opsi ini dikirim ke pengkompilasi tanpa revisi.

Parameter ini memungkinkan Anda mengarahkan pengkompilasi untuk menghasilkan file yang dapat dieksekusi, menyematkan sumber daya, atau mengatur opsi baris perintah, seperti /unsafe opsi .

Jenis:String[]
Position:Named
Nilai default:None
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-IgnoreWarnings

Mengabaikan peringatan kompilator. Gunakan parameter ini untuk mencegah Add-Type penanganan peringatan kompilator sebagai kesalahan.

Jenis:SwitchParameter
Position:Named
Nilai default:False
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-Language

Menentukan bahasa yang digunakan dalam kode sumber. Nilai yang dapat diterima untuk parameter ini adalah CSharp.

Jenis:Language
Nilai yang diterima:CSharp
Position:Named
Nilai default:CSharp
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-LiteralPath

Menentukan jalur ke file kode sumber atau file DLL rakitan yang berisi jenis. Tidak seperti Path, nilai parameter LiteralPath digunakan persis seperti yang ditik. Tidak ada karakter yang ditafsirkan sebagai kartubebas. Jika jalur menyertakan karakter escape, sertakan dalam tanda kutip tunggal. Tanda kutip tunggal memberi tahu PowerShell untuk tidak menginterpretasikan karakter apa pun sebagai urutan escape.

Menggunakan parameter Path atau LiteralPath menjamin bahwa Anda memuat assembly yang ingin Anda muat.

Jenis:String[]
Alias:PSPath, LP
Position:Named
Nilai default:None
Diperlukan:True
Terima input alur:False
Terima karakter wildcard:False

-MemberDefinition

Menentukan properti atau metode baru untuk kelas . Add-Type menghasilkan kode templat yang diperlukan untuk mendukung properti atau metode.

Di Windows, Anda dapat menggunakan fitur ini untuk melakukan panggilan Platform Invoke (P/Invoke) ke fungsi yang tidak dikelola di PowerShell.

Jenis:String[]
Position:1
Nilai default:None
Diperlukan:True
Terima input alur:False
Terima karakter wildcard:False

-Name

Menentukan nama kelas yang akan dibuat. Parameter ini diperlukan saat menghasilkan jenis dari definisi anggota.

Nama jenis dan namespace harus unik dalam sesi. Anda tidak dapat membongkar jenis atau mengubahnya. Untuk mengubah kode untuk jenis, Anda harus mengubah nama atau memulai sesi PowerShell baru. Jika tidak, perintah gagal.

Jenis:String
Position:0
Nilai default:None
Diperlukan:True
Terima input alur:False
Terima karakter wildcard:False

-Namespace

Menentukan namespace untuk jenis tersebut.

Jika parameter ini tidak disertakan dalam perintah, jenis dibuat di namespace Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes . Jika parameter disertakan dalam perintah dengan nilai string kosong atau nilai $Null, jenisnya dihasilkan di namespace global.

Jenis:String
Alias:NS
Position:Named
Nilai default:None
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-OutputAssembly

Menghasilkan file DLL untuk rakitan dengan nama yang ditentukan di lokasi. Masukkan jalur opsional dan nama file. Karakter kartubebas diizinkan. Secara default, Add-Type menghasilkan rakitan hanya dalam memori.

Jenis:String
Alias:OA
Position:Named
Nilai default:None
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:True

-OutputType

Menentukan jenis output rakitan output. Secara default, tidak ada jenis output yang ditentukan. Parameter ini hanya valid ketika rakitan output ditentukan dalam perintah . Untuk informasi selengkapnya tentang nilai, lihat OutputAssemblyType Enumeration.

Nilai yang dapat diterima untuk parameter ini adalah sebagai berikut:

  • ConsoleApplication
  • Library
  • WindowsApplication

Penting

Pada PowerShell 7.1, ConsoleApplication dan WindowsApplication tidak didukung dan PowerShell melemparkan kesalahan penghentian jika ditentukan sebagai nilai untuk parameter OutputType .

Jenis:OutputAssemblyType
Alias:OT
Nilai yang diterima:ConsoleApplication, Library, WindowsApplication
Position:Named
Nilai default:None
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-PassThru

Mengembalikan objek System.Runtime yang mewakili jenis yang ditambahkan. Secara default, cmdlet ini tidak menghasilkan output apa pun.

Jenis:SwitchParameter
Position:Named
Nilai default:False
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-Path

Menentukan jalur ke file kode sumber atau file DLL rakitan yang berisi jenis.

Jika Anda mengirimkan file kode sumber, Add-Type kompilasi kode dalam file dan membuat rakitan dalam memori jenis. Ekstensi file yang ditentukan dalam nilai Jalur menentukan pengkompilasi yang Add-Type menggunakan.

Menggunakan parameter Path atau LiteralPath menjamin bahwa Anda memuat assembly yang ingin Anda muat.

Jenis:String[]
Position:0
Nilai default:None
Diperlukan:True
Terima input alur:False
Terima karakter wildcard:False

-ReferencedAssemblies

Menentukan rakitan tempat jenis bergantung. Secara default, Add-Type referensi System.dll dan System.Management.Automation.dll. Rakitan yang Anda tentukan dengan menggunakan parameter ini dirujuk selain rakitan default.

Dimulai di PowerShell 6, ReferencedAssemblies tidak menyertakan rakitan .NET default. Anda harus menyertakan referensi tertentu ke referensi tersebut dalam nilai yang diteruskan ke parameter ini.

Jenis:String[]
Alias:RA
Position:Named
Nilai default:None
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

-TypeDefinition

Menentukan kode sumber yang berisi definisi jenis. Masukkan kode sumber dalam string atau here-string, atau masukkan variabel yang berisi kode sumber. Untuk informasi selengkapnya tentang here-string, lihat about_Quoting_Rules.

Sertakan deklarasi namespace dalam definisi jenis Anda. Jika Anda menghilangkan deklarasi namespace, jenis Anda mungkin memiliki nama yang sama dengan jenis lain atau pintasan untuk jenis lain, menyebabkan timpaan yang tidak disengaja. Misalnya, jika Anda menentukan jenis yang disebut Pengecualian, skrip yang menggunakan Pengecualian sebagai pintasan untuk System.Exception akan gagal.

Jenis:String
Position:0
Nilai default:None
Diperlukan:True
Terima input alur:False
Terima karakter wildcard:False

-UsingNamespace

Menentukan namespace lain yang diperlukan untuk kelas . Ini mirip dengan kata kunci C#, Using.

Secara default, Add-Type mereferensikan namespace layanan Sistem . Saat parameter MemberDefinition digunakan, Add-Type juga mereferensikan namespace Layanan System.Runtime.InteropServices secara default. Namespace yang Anda tambahkan dengan menggunakan parameter UsingNamespace dirujuk selain namespace default.

Jenis:String[]
Alias:Using
Position:Named
Nilai default:System namespace
Diperlukan:False
Terima input alur:False
Terima karakter wildcard:False

Input

None

Anda tidak dapat menyalurkan objek ke cmdlet ini.

Output

None

Secara default, cmdlet ini tidak mengembalikan output.

Type

Saat Anda menggunakan parameter PassThru , cmdlet ini mengembalikan objek System.Type yang mewakili jenis baru.

Catatan

Jenis yang Anda tambahkan hanya ada di sesi saat ini. Untuk menggunakan jenis di semua sesi, tambahkan ke profil PowerShell Anda. Untuk informasi selengkapnya tentang profil, lihat about_Profiles.

Nama jenis dan namespace harus unik dalam sesi. Anda tidak dapat membongkar jenis atau mengubahnya. Jika Anda perlu mengubah kode untuk jenis, Anda harus mengubah nama atau memulai sesi PowerShell baru. Jika tidak, perintah gagal.

Di Windows PowerShell (versi 5.1 ke bawah), Anda perlu menggunakan Add-Type untuk apa pun yang belum dimuat. Paling umum, ini berlaku untuk rakitan yang ditemukan di Global Assembly Cache (GAC). Di PowerShell 6 dan yang lebih tinggi, tidak ada GAC, sehingga PowerShell menginstal rakitannya sendiri di $PSHOME. Rakitan ini secara otomatis dimuat berdasarkan permintaan, sehingga tidak perlu digunakan Add-Type untuk memuatnya. Namun, penggunaan Add-Type masih diizinkan untuk memungkinkan skrip kompatibel secara implisit dengan versi PowerShell apa pun.

Rakitan dalam GAC dapat dimuat berdasarkan nama jenis, bukan berdasarkan jalur. Memuat rakitan dari jalur arbitrer memerlukan Add-Type, karena rakitan tersebut tidak dapat dimuat secara otomatis.