J W*_*ezy 7 windows git powershell ssis gac
我需要在 SSIS 包的数据流中实现 BCrypt 散列。我想通过将 Bcrypt 程序集部署到 GAC 然后在脚本组件中调用它来做到这一点。我从 Git 下载了项目,构建了强命名项目(我创建了一个密钥),并使用 Powershell 将程序集部署到 GAC。我使用 Powershell 而不是 gacutil.exe,因为我运行的是 Windows 10,它没有 gacutil.exe。
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")
Run Code Online (Sandbox Code Playgroud)
我没有收到任何错误,实际上我没有收到任何输出 - 它只是转到下一行。但是程序集没有安装在%windir%\Microsoft.NET\assembly
知道为什么这不起作用吗?
注意:我采用这种方式而不是使用 NuGet,因为我将在 SSIS 脚本组件中使用它。显然,NuGet 不适用于 SSIS 解决方案。
补充你自己的答案:
我很惊讶这[Reflection.Assembly]::LoadWithPartialName('System.EnterpriseServices')不起作用 - 它对我有用
Add-Type -AssemblyName,但这是一个有争议的问题,因为在 PowerShell 中最好使用,它:
[Reflection.Assembly]::LoadWithPartialName()是安静的无操作)。# Try to load the latest System.EnterpriseServices.dll assembly
# from the GAC.
Add-Type -AssemblyName System.EnterpriseServices
Run Code Online (Sandbox Code Playgroud)
像[Reflection.Assembly]::LoadWithPartialName(),Add-Type -AssemblyName允许您通过简单的名称加载 GAC 程序集(也反映在 DLL/可执行文件名中,没有扩展名),这既不需要您知道程序集的版本号,也不需要知道它的公钥(但是,Add-Type -AssemblyName也不会首先查看该应用程序目录,这在PowerShell中大概也是PowerShell的可执行文件本身)的位置。
请注意,这[Reflection.Assembly]::LoadWithPartialName()是正式声明obsolete,因为通过简单名称加载程序集可能会在以后破坏现有代码,因为安装了不兼容的版本或具有重复简单名称的程序集。
然而,在后期绑定脚本语言,比如PowerShell中,加载由简单的名称是可以接受的(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'
Run Code Online (Sandbox Code Playgroud)
退一步:
我建议避免在 GAC: 中放置自定义程序集,原因有两个:
PowerShell [Core] 6+ 最终将使 Windows PowerShell 过时,它构建在 .NET Core之上,不再具有 GAC,因此在迁移时需要不同的方法。
Add-Type -AssemblyName在 PowerShell 本身附带的程序集中查找由简单名称给出的程序集,尽管它首先在当前目录中查找。System.EnterpriseServices.Internal.Publish您使用的 类型没有正式支持直接使用:“Publish由 .NET Framework 在内部使用。您不需要直接在代码中使用它。”,并且是在 .NET Framework 中安装程序集的唯一官方支持的方式GAC 通过Windows 安装程序(gacutil.exe仅用于开发期间)。
相反,我推荐以下方法:
编写一个辅助 PowerShell 模块来包装感兴趣的程序集,例如命名为BCrypt.
将该模块放在 中列出的目录之一中$env:PSModulePath,以便执行的任何脚本都Import-Module BCrypt将感兴趣的程序集隐式加载到会话中。
这样的模块很容易编写:
选择 中列出的合适目录$env:PSModulePath并在其中创建一个名为的子目录BCrypt。
将您的程序集 DLL ( BCrypt.Net-Next.dll)复制到该子目录中。
切换到子目录并在BCrypt.psd1那里创建一个模块清单:
New-ModuleManifest BCrypt.psd1 -RequiredAssemblies BCrypt.Net-Next.dll -ModuleVersion 1.0
Run Code Online (Sandbox Code Playgroud)
New-ModuleManifest根据需要提供其他参数和/或事后根据需要编辑模块清单。