在 PowerShell 脚本中导入依赖 DLL
Posted
技术标签:
【中文标题】在 PowerShell 脚本中导入依赖 DLL【英文标题】:Importing Dependent DLLs in a PowerShell Script 【发布时间】:2022-01-12 09:12:50 【问题描述】:问题陈述:
的最佳方式。
说明:
我有一个 DLL,即 a.dll,它对 b.dll、c.dll、...有近 10 个依赖项。 DLL 不存在于它引发错误的同一目录中。我只有 Nuget 包中的 DLL。包像往常一样会在
├── Nuget-A
│ ├── 1.0
| | |── a.dll
│
├── Nuget-B
│ ├── 2.0
| | |── b.dll
在 PoweShell 脚本中,我将导入 a.dll,
导入模块“Nuget-A/1.0/a.dll”
这会给我一个错误,所以我执行以下操作
导入模块“Nuget-B/2.0/b.dll” 导入模块“Nuget-A/1.0/a.dll”
对于 10 个 DLL,我必须这样做。
处理场景的最佳方式是什么?我也对任何其他方法持开放态度
【问题讨论】:
【参考方案1】:我对 PowerShell 的经验不是很丰富,但我希望如果所有程序集都在同一个目录中,那么当您导入 a.dll
时,它会自动找到引用,例如 b.dll
。这就是 .NET 运行时加载程序集的方式,或多或少,与 PowerShell、控制台应用程序、Web 应用程序等无关。
因此,不要创建仅包含 a.dll
的包 A
和对包 B
的依赖项,而是让包 A
没有任何依赖项,并在其中包含所有 10 个 dll。
有几种方法可以实现这一目标。一种是重用csproj的PackAsTool
。它发布项目(使用dotnet publish
的等效项),然后将所有内容打包到发布文件夹中。由于它旨在打包控制台应用程序,以便以后可以通过dotnet tool install
安装它们,因此您可能需要做一些黑客操作才能使其正常工作。另一种方法是运行dotnet publish
,然后从nuget.org/downloads 获取nuget.exe,然后cd 到发布目录运行nuget.exe spec
以创建模板.nuspec
文件,使用您想要的所有元数据编辑该nuspec,然后运行nuget.exe pack
。它会将目录中的所有文件打包到一个 nupkg 中。还有其他方法,例如尝试 nugetizer,这是一个社区创建的工具,但这个问题是关于如何解决引用的程序集加载,而不是如何打包,所以我会留在那里。我的观点是,当您有一个包含 PowerShell cmdlet 的包时,您不必担心使用该包加载 powershell 脚本/环境中的所有依赖项,因此请确保该包是“自包含的”。它将负担从消耗时间转移到打包时间,但在打包时间所有依赖项都是已知的,因此更容易解决问题。
【讨论】:
解决了我的问题。非常感谢!以上是关于在 PowerShell 脚本中导入依赖 DLL的主要内容,如果未能解决你的问题,请参考以下文章