如何在PowerShell中加载DLL文件

3
我正在按照MS文档中的步骤,在PowerShell中使用Kusto,每当我运行安装脚本时,
$packagesRoot = "C:\Myfiles\tools"
dir $packagesRoot\* | Unblock-File
[System.Reflection.Assembly]::LoadFrom("$packagesRoot\Kusto.Data.dll")

我得到的GAC为False,无法安装以下的Kusto Dll文件。

enter image description here

请帮助我。

如果你正在以管理员权限运行脚本,怎么办? - Zilog80
我已查看了链接的文档页面,并在问题建议切换到Add-Type -LiteralPath的示例代码中,以防止混淆。 - mklement0
1
很抱歉听到这个消息,@Dennis。我已经删除了之前的评论,因为他们似乎从他们的repo中删除了Issues部分,导致我的建议链接现在失效了。但是,为了概括建议的要点:使用Add-Type -LiteralPath "$packagesRoot\Kusto.Data.dll"而不是System.Reflection.Assembly]::LoadFrom("$packagesRoot\Kusto.Data.dll")不仅更符合PowerShell惯例,而且默认情况下是_静默的_,这避免了手头的问题。 - mklement0
我觉得微软现在有一个新的反馈系统,如果你想再试一次的话 :) - Dennis
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 中安装程序集,它们只是从当前磁盘位置加载程序集到当前会话中供使用。

  • 一般来说:

    • 只有 Windows 安装程序才可以将程序集安装到 GAC 中 - 参见 文档
    • PowerShell (Core) 7+,Windows PowerShell 的跨平台继任者,不再基于 .NET Framework 构建,而是基于跨平台的 .NET (Core) / .NET 5+,其不再具有 GAC

[1] -PassThru 总是输出 类型,而不是 程序集 信息,因此当你将 -PassThru-Path / -LiteralPath 结合使用时,即加载程序集时,输出的是关于 程序集中包含的类型 的信息(不是描述程序集 本身 的对象,这就是 [System.Reflection.Assembly]::LoadFrom 所做的事情)。但是,由于 PowerShell 7.1 中存在与 转发 类型相关的错误,后者没有被包括在内,这可能导致 完全没有输出 - 请参见 GitHub issue #10802


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接