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

时间:2015-09-14 14:41:16

标签: powershell gac

我正在编写一个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'
)

我考虑过的另一个选项(但可能在某处破坏了EULA)是将程序集复制到服务器共享和引用,如下所示:

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

但是我应该怎么做呢?

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

更新:我已尝试仅在清单中指定程序集的名称,这似乎有效。

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

2 个答案:

答案 0 :(得分:3)

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

要从GAC加载,请使用带有完全限定程序集名称的Add-Type cmdlet ...

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

相关: How do I use Add-Type to load Microsoft.Web.Deployment?

答案 1 :(得分:0)

您也可以只指定没有版本信息的程序集:

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