如何在 PowerShell 中加载 DLL 文件

How to load DLL files in PowerShell

我正在关注 MS Document 在 PowerShell 中使用 Kusto,

每当我运行安装脚本时,

$packagesRoot = "C:\Myfiles\tools"
dir $packagesRoot\* | Unblock-File
[System.Reflection.Assembly]::LoadFrom("$packagesRoot\Kusto.Data.dll")

我得到的 GAC 是错误的,无法安装 Kusto Dll 文件,如下所示

请帮帮我

  • 没有错误,只是(你的)意外输出;只需使用
    $null = [System.Reflection.Assembly]::LoadFrom("$packagesRoot\Kusto.Data.dll")
    抑制不需要的输出。

  • 但是,PowerShell 惯用的加载程序集的方法 是使用 Add-Type,默认情况下它是静默的 (但加载失败会报错),除非你使用-PassThru[1]:

Add-Type -LiteralPath "$packagesRoot\Kusto.Data.dll"

您看到的输出只是 PowerShell 的格式化系统如何表示 System.Reflection.Assembly object returned from the System.Reflection.Assembly.LoadFrom() 调用 - 返回这样一个对象的事实意味着 成功 .

反映 FalseGAC 列只是告诉您问题中的程序集未存储在 GAC 中。


顺便提一下 GAC(全局程序集缓存):

  • System.Reflection.Assembly.LoadFrom()也不Add-Type安装程序集[在GAC中],他们只是加载一个程序集从其当前磁盘位置进入当前会话以供使用。

  • 一般来说:

    • 在 GAC 中安装程序集只能由 Windows 安装程序执行 - 请参阅 the docs
    • PowerShell (Core) 7+,Windows PowerShell 的跨平台继任者,不再基于 .NET Framework,但它的跨平台成功,.NET (Core) / .NET 5+ ,不再有 GAC

[1] -PassThru 总是输出 type,而不是 assembly 信息,这样当你将 -PassThru-Path / -LiteralPath 组合,即当您加载程序集时,输出的是关于程序集 中包含的 类型的信息对象(不是描述程序集 本身 的对象,这是 [System.Reflection.Assembly]::LoadFrom 所做的)。然而,由于 PowerShell 7.1 中与 forwarded 类型相关的错误,后者不包括在内,这可能导致 no output 完全 -见 GitHub issue #10802.