如何在PowerShell中加载DLL文件

问题描述 投票:0回答:2

我正在按照 MS Document 在 PowerShell 中使用 Kusto,

每当我运行安装脚本时,

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

我的 GAC 为 False,无法安装 Kusto Dll 文件,如下所示

请帮助我。

powershell dll .net-assembly gac azure-data-explorer
2个回答
2
投票
  • 没有错误,只是(你)意外的输出;只需使用

    $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
调用返回的
System.Reflection.Assembly.LoadFrom()
对象 - 而返回这样的对象这一事实意味着 成功

反映

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


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

  • 既不

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

  • 一般来说:

    • 在 GAC 中安装程序集只能由 Windows Installer 执行 - 请参阅文档
    • 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 类型相关的错误,后者不包括在内,这可能导致完全无输出 - 请参阅 GitHub 问题 #10802


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.