PowerShell - 检查.NET类是否存在

时间:2017-04-27 01:25:23

标签: .net powershell types

我有一个DLL文件,我将其导入PS会话。这将创建一个新的.NET类。在函数的开头我想测试这个类是否存在,以及它是否导入DLL文件。

目前我正在尝试打电话给班级。这有效,但我认为它导致Do {} Until()循环出现问题,因为我必须运行两次脚本。

我的代码。请注意Do {} Until ()循环不起作用。 https://gist.github.com/TheRealNoob/f07e0d981a3e079db13d16fe00116a9a

我找到了[System.Type]::GetType()方法但是当我针对任何类型的字符串,有效或无效的类运行它时,它都没有做任何事情。

4 个答案:

答案 0 :(得分:1)

在.Net中,它存在一种名为Reflexion的东西,它允许你处理代码中的所有内容。

$type = [System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetTypes() | where {$_.Name -eq 'String'}}

在这里,我查找类型String,但您可以查找类型或更好的程序集版本,甚至可以找到一个方法是否存在正确的参数。看看C# - How to check if namespace, class or method exists in C#?

@Timmerman评论;他跟着去了:

[System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetTypes() | where {$_.Name -like "SQLiteConnection"}}

[System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetTypes() | where {$_.AssemblyQualifiedName -like 'Assembly Qualified Name'}}

答案 1 :(得分:1)

您可以使用-as在powershell中将字符串转换为[system.type]

PS C:\> 'int' -as [type]

IsPublic IsSerial Name    BaseType
-------- -------- ----    --------
True     True     Int32   System.ValueType

如果找不到类型(与其他强制转换方案一样),则表达式不返回任何内容:

PS C:\> 'notatype' -as [type]

PS C:\> 

因此,您可以使用以下方法检索特定类型(无需遍历应用程序域中加载的所有程序集的所有类型):

$type = 'notatype' -as [type]

#or

if ('int' -as [type]) { 
  'Success!' 
}

#and conveniently

$typeName = 'Microsoft.Data.Sqlite.SqliteConnection'
if (-not($typeName -as [type])) {
   #load the type
}

答案 2 :(得分:1)

这是-is和-as的意思。您还可以将-is与try / catch语句一起使用,以检查该类是否存在:

try
{
   [test.namespace] -is [type]
}
catch
{
    add-type -typedefinition test.namespace.dll
}

el2iot2完美地描述了-as的用法,这将是我的首选方法。旨在避免在类转换期间出错。

答案 3 :(得分:0)

我推荐the el2iot2's approach with -as

如果您比-as更喜欢尝试捕获方法,建议您按照the Shaun Stevens's answer[SomeType]::Equals($null, $null)替换答案中的[SomeType] -is [type]

但是,如果我既未阅读el2iot2的回答,也未阅读Shaun Stevens的回答,则将使用以下内容:

try {
    [SomeType]::Equals($null, $null) >$null
    Write-Host '"SomeType" exists'
}
catch {
    Write-Host '"SomeType" does not exist'
}

(说明:每种类型都应具有Equals静态方法,该方法允许使用两个$null进行调用,并在这种情况下返回$true;尝试引用不存在的方法以这种方式输入应该抛出SystemException的实例,可以将其捕获。)

它甚至可以用作单线:

$someTypeExists = try {[SomeType]::Equals($null, $null)} catch {$false}