gpt4 book ai didi

windows - 无法使用 Powershell 在 Windows 10 上将 Bcrypt.Net-Next 程序集安装到 GAC

转载 作者:行者123 更新时间:2023-12-02 22:11:47 27 4
gpt4 key购买 nike

我需要在 SSIS 包的数据流中实现 BCrypt 散列。我想通过将 Bcrypt 程序集部署到 GAC 然后在脚本组件中调用它来做到这一点。我从 Git 下载了项目,构建了强命名项目(我创建了一个 key ),并使用 Powershell 将程序集部署到 GAC。我使用 Powershell 而不是 gacutil.exe,因为我运行的是没有 gacutil.exe 的 Windows 10。

https://github.com/BcryptNet/bcrypt.net

# NOTE: Run powershell as administrator
[Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices") | Out-Null
[System.EnterpriseServices.Internal.Publish] $publish = New-Object System.EnterpriseServices.Internal.Publish

# to install a dll
$publish.GacInstall("C:\temp\Bcrypt.net\BCrypt.Net-Next.dll")

我没有收到任何错误,实际上我没有得到任何输出 - 它只是转到下一行。但是该程序集未安装在 %windir%\Microsoft.NET\程序集

知道为什么这不起作用吗?

注意:我是这样做的,而不是使用 NuGet,因为我将在 SSIS 脚本组件中使用它。显然,NuGet 不适用于 SSIS 解决方案。

最佳答案

补充your own answer :
我很惊讶[Reflection.Assembly]::LoadWithPartialName('System.EnterpriseServices')没用 - 它对我有用,但这是一个有争议的问题,因为 在 PowerShell 中最好使用
Add-Type -AssemblyName
, 哪一个:

  • 就其语法而言,它更符合 PowerShell 的习惯,
  • 如果无法加载程序集,则报告(语句终止)错误(而 [Reflection.Assembly]::LoadWithPartialName() 在加载程序集失败的情况下是安静的空操作)。
  • # Try to load the latest System.EnterpriseServices.dll assembly
    # from the GAC.
    Add-Type -AssemblyName System.EnterpriseServices
    点赞 [Reflection.Assembly]::LoadWithPartialName() , Add-Type -AssemblyName允许您通过它们的简单名称加载 GAC 程序集(也反射(reflect)在不带扩展名的 DLL/可执行文件名中),这既不需要您知道程序集的版本号也不需要知道它的公钥(但是, Add-Type -AssemblyName 也不首先查看在应用程序目录中,在 PowerShell 中可能是 PowerShell 可执行文件本身的位置)。
    请注意 [Reflection.Assembly]::LoadWithPartialName()已正式宣布过时 , 因为 通过简单名称加载程序集可能会在以后破坏现有代码 ,由于安装了不兼容的版本或具有重复简单名称的程序集。
    但是, 在 PowerShell 等后期绑定(bind)脚本语言中,可以接受通过简单名称加载(Add-Type -AssemblyName 并未过时) , 并简化了加载(但是,您可以指定程序集的明确全名 - 见下文)。
    当然,如果 [Reflection.Assembly]::LoadWithPartialName('System.EnterpriseServices')莫名其妙对你不起作用, Add-Type -AssemblyName System.EnterpriseServices可能同样会失败,但一般观点是成立的。 [Reflection.Assembly]::LoadWithPartialName() 的推荐替换是 [Reflection.Assembly]::Load() ,这就是你最终使用的。它 要求您知道程序集的全名 ,其中必须包括程序集的 完整版本号及其公钥 - 尽管似乎接受了比 GAC 中实际存在的版本号更低的版本号。
    请注意 Add-Type -AssemblyName接受(强命名)完整的程序集名称 也:
    # Load from the GAC by *full assembly name*.
    # Equivalent of [Reflection.Assembly]::Load()
    Add-Type -AssemblyName 'System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

    退后一步:
    我建议避免在 GAC 中放置自定义程序集: ,有两个原因:
  • PowerShell [Core] 6+ 最终将使 Windows PowerShell 过时,它是基于 .NET Core 构建的,它不再具有 GAC,因此在迁移时您将需要一种不同的方法。
  • 在 PowerShell [核心] 中,Add-Type -AssemblyName在 PowerShell 本身附带的程序集中查找由简单名称给出的程序集,尽管它首先在当前目录中查找。

  • System.EnterpriseServices.Internal.Publish 您正在使用的类型不受官方支持直接使用:“Publish 由 .NET Framework 内部使用。您不需要直接在代码中使用它。”,以及唯一官方支持的安装程序集的方式在 GAC 中是通过 Windows 安装程序(gacutil.exe 仅在开发期间使用)。

  • 相反,我 推荐以下方法 :
  • 编写一个包装感兴趣的程序集的辅助 PowerShell 模块 ,比如说,BCrypt .
  • 将该模块放在$env:PSModulePath 中列出的目录之一中 , 以便任何执行 Import-Module BCrypt 的脚本将感兴趣的程序集隐式加载到 session 中。

  • 这样的模块很容易编写:
  • 选择 $env:PSModulePath 中列出的合适目录并创建一个名为 BCrypt 的子目录在里面。
  • 将您的程序集 DLL (BCrypt.Net-Next.dll) 复制到该子目录中。
  • 切换到子目录并创建一个模块 list BCrypt.psd1那里:
      New-ModuleManifest BCrypt.psd1 -RequiredAssemblies BCrypt.Net-Next.dll -ModuleVersion 1.0

  • 提供额外的 New-ModuleManifest 根据需要提供参数和/或根据需要在事后编辑模块 list 。

    关于windows - 无法使用 Powershell 在 Windows 10 上将 Bcrypt.Net-Next 程序集安装到 GAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60569511/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com