C# PowerShell.NET对象缺少方法

C# PowerShell.NET对象缺少方法,c#,.net,powershell,C#,.net,Powershell,我在PowerShell中使用IO.Compression命名空间,遇到了一个问题,即在我的C#代码中可用的方法在PowerShell中不可用 C#代码段 PowerShell中类似的代码开头 Add-Type -assembly System.IO.Compression.FileSystem $archfile = "c:\temp\a1.zip" # open mode: 1: Create, 2: Update $archive = [System.IO.Compression.ZipF

我在PowerShell中使用IO.Compression命名空间,遇到了一个问题,即在我的C#代码中可用的方法在PowerShell中不可用

C#代码段

PowerShell中类似的代码开头

Add-Type -assembly System.IO.Compression.FileSystem
$archfile = "c:\temp\a1.zip"
# open mode: 1: Create, 2: Update
$archive = [System.IO.Compression.ZipFile]::Open("C:\temp\2.zip", 2)
$archive.CreateEntryFromFile($source, "myfolder\folder2\file.log")
查看成员后,发现缺少CreateEntryFromFile()函数(以及其他函数)。变量是ZipArchive的一种类型,将创建一个新文件。
$archive |获取成员
显示:

   TypeName: System.IO.Compression.ZipArchive

Name        MemberType Definition
----        ---------- ----------
CreateEntry Method     System.IO.Compression.ZipArchiveEntry CreateEntry(string entryName), System.IO.Compression.ZipArchiveE...
Dispose     Method     void Dispose(), void IDisposable.Dispose()
Equals      Method     bool Equals(System.Object obj)
GetEntry    Method     System.IO.Compression.ZipArchiveEntry GetEntry(string entryName)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()
Entries     Property   System.Collections.ObjectModel.ReadOnlyCollection[System.IO.Compression.ZipArchiveEntry] Entries {get;}
Mode        Property   System.IO.Compression.ZipArchiveMode Mode {get;}
这只是PowerShell创建.NET对象的一部分吗?并非所有方法都受支持(或可以支持)


ZipArchive引用:

CreateEntryFromFile
是一个扩展方法,因此它不会出现在Powershell中的
ZipArchive
类中

Add-Type -AssemblyName System.IO.Compression.FileSystem

Update-TypeData -TypeName System.IO.Compression.ZipArchive -MemberType 
ScriptMethod -MemberName CreateEntryFromFile -Value {
    switch ($args.Count)
    {
        2 { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($this, $args[0], $args[1]) }
        3 { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($this, $args[0], $args[1], $args[2]) }
        default { throw "No overload for CreateEntryFromFile takes the specified number of parameters." }
    }
}

$archfile = "c:\temp\a1.zip"
# open mode: 1: Create, 2: Update
$archive = [System.IO.Compression.ZipFile]::Open("C:\temp\2.zip", 2)
$archive.CreateEntryFromFile($source, "myfolder\folder2\file.log")
选择1 在Powershell 3.0或更高版本中,可以声明在Powershell中使用的扩展方法

Add-Type -AssemblyName System.IO.Compression.FileSystem

Update-TypeData -TypeName System.IO.Compression.ZipArchive -MemberType 
ScriptMethod -MemberName CreateEntryFromFile -Value {
    switch ($args.Count)
    {
        2 { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($this, $args[0], $args[1]) }
        3 { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($this, $args[0], $args[1], $args[2]) }
        default { throw "No overload for CreateEntryFromFile takes the specified number of parameters." }
    }
}

$archfile = "c:\temp\a1.zip"
# open mode: 1: Create, 2: Update
$archive = [System.IO.Compression.ZipFile]::Open("C:\temp\2.zip", 2)
$archive.CreateEntryFromFile($source, "myfolder\folder2\file.log")
选择2 只需将扩展方法用作普通的静态方法

$archfile = "c:\temp\a1.zip"
# open mode: 1: Create, 2: Update
$archive = [System.IO.Compression.ZipFile]::Open("C:\temp\2.zip", 2)
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($archive, $source, "myfolder\folder2\file.log")
第二个选项是更少的代码,也适用于较旧版本的Powershell

Add-Type -AssemblyName System.IO.Compression.FileSystem

Update-TypeData -TypeName System.IO.Compression.ZipArchive -MemberType 
ScriptMethod -MemberName CreateEntryFromFile -Value {
    switch ($args.Count)
    {
        2 { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($this, $args[0], $args[1]) }
        3 { [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($this, $args[0], $args[1], $args[2]) }
        default { throw "No overload for CreateEntryFromFile takes the specified number of parameters." }
    }
}

$archfile = "c:\temp\a1.zip"
# open mode: 1: Create, 2: Update
$archive = [System.IO.Compression.ZipFile]::Open("C:\temp\2.zip", 2)
$archive.CreateEntryFromFile($source, "myfolder\folder2\file.log")

参考资料:

可能是因为它使用了一些较旧的.NET版本吗?请参阅
CreateEntryFromFile
是一种扩展方法。注意,您也可以直接调用扩展方法,因为它们是静态的
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($archive,$source,“myfolder\folder2\file.log”)
@NightOwl888适合我,请将其作为答案。谢谢,为什么投反对票?