如何在PowerShell模块中引用GAC中的程序集?

3
我将要编写一个PowerShell模块,该模块依赖于SQL Server中的SMO程序集。(我需要引用的唯一程序集是Microsoft.SqlServer.Smo.dll)
在开发模块时,我只需复制所需的程序集并将其引用到我的清单文件中,类似于以下方式:
RequiredAssemblies = @(         
    "$env:userprofile\Documents\WindowsPowerShell\Modules\Dependencies\Microsoft.SqlServer.Smo.dll"
)

我认为,在生产环境中,您希望从标准位置引用程序集。 我会假设标准位置是全局程序集缓存(GAC)。

如果我从GAC引用程序集,我会得到这个结果,但如果安装了程序集的新版本,这似乎可能会出现问题:

RequiredAssemblies = @(
    'C:\WINDOWS\assembly\gac_msil\Microsoft.SqlServer.Smo\12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll'
)

我也可以直接从SDK中引用程序集:

RequiredAssemblies = @(
    'C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll'
)

我考虑过另一种选择(但可能会违反某个最终用户许可协议),就是将程序集复制到服务器共享文件夹,并像这样引用它:

RequiredAssemblies = @(
    '\\MyServer\PowerShellDependencies\Microsoft.SqlServer.Smo.dll'
)

但是我应该如何做呢?

如果相关,所有安装此模块的计算机都是64位的,并且将安装SMO库。此外,这不是一款公开可用的软件,它正在部署在公司网络上。

更新:我尝试只在清单中指定程序集的名称,这似乎可以工作。

RequiredAssemblies = @(
    'Microsoft.SqlServer.Smo.dll'
)

SMO对象是否已经在GAC中可用,还是需要安装它们? - Rich Rousseau
@RichRousseau,我正在尝试确定是否可以将.dll文件与模块捆绑在一起,否则就必须先预安装它们。 - Jake
2个回答

3

除非您将SMO程序集部署为私有程序集,否则不建议直接引用加载它们。

要从全局程序集缓存中加载,请使用完全限定的程序集名称和Add-Type命令...

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"

相关: 如何使用 Add-Type 加载 Microsoft.Web.Deployment?


你能解释一下“私有程序集”是什么意思吗? - Jake
任何不在全局程序集缓存(GAC)中的程序集,因此您构建和部署应用程序时部署的任何自定义程序集或未在GAC中注册的任何第三方程序集,都属于此范畴。 - Rich Rousseau
从技术上讲,我需要的程序集并不是定制的,因为它们是微软技术的一部分。如果我有合法权利将这些程序集与模块一起重新分发,那么每个人都会很高兴。我只是想找到一些东西,告诉我是否可以这样做,而不违反任何最终用户许可协议。 - Jake
对于任何试图查找程序集版本和公钥的人,可以前往 C:\Windows\assembly\GAC_MSIL<My.Assumbly.Name>,您将看到一个以<Version>__<PublicKey>形式命名的文件夹。获取程序集名称、版本和公钥位,并将它们替换为上述字符串,然后您就可以开始了。 - Chris Magnuson

0

你也可以只指定程序集而不包括版本信息:

Add-Type -AssemblyName "System.Xml.Linq"

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