在powershell core 6.2中,我使用Add-Type添加了EPPlus程序集,并尝试使用New-Object实例化程序集中定义的类型的对象。即使我确认程序集已加载正常,实例化也会失败。
我可以实例化加载的程序集中的某些类型,例如OfficeOpenXml.ExcelTextFormat。我最想实例化的类型(OfficeOpenXml.ExcelPackage)失败。我已经确认该程序集是dotnet核心,并且该类型具有默认构造函数。
使用以下命令加载程序集
: Add-Type -AssemblyName 'C:\Users\lorimer1\.nuget\packages\epplus\4.5.3.1\lib\netstandard2.0\EPPlus.dll'
确认程序集已加载:
$asm = [appdomain]::currentdomain.GetAssemblies() | Where-Object Location -match 'EPPLus'
我可以成功实例化ExcelTextFormat:
$format = new-object -TypeName OfficeOpenXml.ExcelTextFormat
但是实例化ExcelPackage失败:
$test = New-Object -TypeName OfficeOpenXml.ExcelPackage
错误消息:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
New-Object : Exception calling ".ctor" with "0" argument(s): "Could not load file or assembly 'Microsoft.Extensions.Configuration, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified."
我确认了声明的构造函数:
DeclaredConstructors : {Void .ctor(), Void .ctor(System.IO.FileInfo), Void .ctor(System.IO.FileInfo, System.String), Void .ctor(System.IO.FileInfo, System.IO.FileInfo)…}
编辑:我从GitHub克隆了epplus项目,发现epplus dll中的ExcelPackage类对Microsoft.Extensions.Configuration有依赖性...看来Add-Type不能解决依赖性并加载它们。有一个-ReferencedAssemblies选项,但这需要一个人预先知道需要什么程序集。如果需要很多,Add-Type命令可能会变得很大。有谁知道如何确定dll的依赖项并加载它们。我在这里假设所有依赖项都是dotnet核心的一部分(不是自定义程序集)。