有时在我的PowerShell脚本中,我需要使用访问特定的DLL Add-Type -AssemblyName.但是,我需要的DLL并不总是在机器上或GAC中.例如,我可能想要一个使用Dapper查询数据库的快速脚本.在这些情况下,我一直在将DLL与ps1文件一起复制.我想知道这是不是常见/一个好主意,是否有现有的扩展会加载NuGet包,然后存储在全局或本地文件夹中并Add-Type -AssemblyName自动调用.
它分别与使用npm或pip在Node.js或Python中很相似.
我做了一些研究,并没有内置到旧版本的PowerShell.我试图从头开始编写一个使用的nuget.exe
&"$(Get-Location)/nuget.exe" install $packageName -Version $version -OutputDirectory "$(Get-Location)/packages" -NoCache -NoInteractive
Run Code Online (Sandbox Code Playgroud)
这将下载当前文件夹中"packages"文件夹下的给定包/版本及其任何依赖项.但是,它看起来像下载每个框架版本,没有明显的方法来告诉您哪个用于您的给定环境.
否则,您可以循环遍历结果并调用Add-Type:
Get-ChildItem .\packages\ -Recurse -Filter "*.dll" | % {
try
{
Add-Type -Path $_.FullName
}
catch [System.Exception]
{
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用restore命令使用project.json文件来查看我是否可以控制框架版本而没有运气.这对我来说太过于苛刻了.
我将查看@ crownedjitter关于使用PowerShell 5的建议.
使用@ crownedjitter的建议,我最终能够使用NuGet注册PackageManagement模块(请参阅下面的评论).使用以下命令,我能够重现Nuget.exe上面的命令正在执行的操作:
Install-Package Dapper -Destination packages
Run Code Online (Sandbox Code Playgroud)
显然,这要短得多.问题是它有同样的局限性; 它降低了包的每个框架版本.如果这包括.NET核心,它会带来很多.NET核心框架!似乎没有办法指定目标框架(又名.NET 4.5.1或更低版本).
我想知道是否有办法根据PowerShell的当前$PSVersionTable.CLRVersion字段确定从哪个NuGet包文件夹加载DLL .