我有一个DLL文件,我将其导入PS会话。这将创建一个新的.NET类。在函数的开头我想测试这个类是否存在,以及它是否导入DLL文件。
目前我正在尝试打电话给班级。这有效,但我认为它导致Do {} Until()循环出现问题,因为我必须运行两次脚本。
我的代码。请注意Do {} Until ()
循环不起作用。
https://gist.github.com/TheRealNoob/f07e0d981a3e079db13d16fe00116a9a
我找到了[System.Type]::GetType()
方法但是当我针对任何类型的字符串,有效或无效的类运行它时,它都没有做任何事情。
答案 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]
1 strong>。
但是,如果我既未阅读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}