PowerShell中iCal.Net组件加载失败:如何定位并加载.dll文件
问题
使用PowerShell结合iCal.Net包读取.ics文件时,执行以下操作后创建Calendar对象报错:
# install ical.net dependencies Install-Package NodaTime -Force # install ical.net package Install-Package iCal.Net -Force # variables $icsfile = "C:\Users\Windows\Desktop\ical\caalendar.ical" $icsurl = "https://url_to_download/basic.ics" # download ics file Invoke-WebRequest $icsurl -OutFile $icsfile # create new calendar object $calendar = New-Object Ical.Net.Calendar
报错信息:
New-Object : Cannot find type [Ical.Net.Calendar]: verify that the assembly containing this type is loaded. At line:1 char:13 + $calendar = New-Object Ical.Net.Calendar + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
已安装iCal.Net包但未加载对应程序集,需定位并加载.dll文件。
解决方案
1. 定位iCal.Net及依赖的.dll文件
Install-Package默认将包安装到当前用户的NuGet目录,可通过以下命令自动查找最新版本的.dll:
# 查找最新版Ical.Net.dll $icalDll = Get-ChildItem -Path "$env:USERPROFILE\.nuget\packages\ical.net" -Recurse -Filter "Ical.Net.dll" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName # 查找最新版NodaTime.dll(iCal.Net的依赖) $nodaTimeDll = Get-ChildItem -Path "$env:USERPROFILE\.nuget\packages\nodatime" -Recurse -Filter "NodaTime.dll" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName
2. 加载程序集
找到路径后用Add-Type加载:
Add-Type -Path $nodaTimeDll Add-Type -Path $icalDll
3. 完整修正后的脚本
# 安装依赖包 Install-Package NodaTime -Force Install-Package iCal.Net -Force # 查找并加载程序集 $icalDll = Get-ChildItem -Path "$env:USERPROFILE\.nuget\packages\ical.net" -Recurse -Filter "Ical.Net.dll" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName $nodaTimeDll = Get-ChildItem -Path "$env:USERPROFILE\.nuget\packages\nodatime" -Recurse -Filter "NodaTime.dll" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName Add-Type -Path $nodaTimeDll Add-Type -Path $icalDll # 下载ICS文件 $icsfile = "C:\Users\Windows\Desktop\ical\caalendar.ical" $icsurl = "https://url_to_download/basic.ics" Invoke-WebRequest $icsurl -OutFile $icsfile # 读取并解析ICS文件(使用iCal.Net提供的静态方法更便捷) $calendar = [Ical.Net.Calendar]::LoadFromFile($icsfile)
补充说明
LoadFromFile是iCal.Net官方提供的静态方法,直接从文件加载解析日历,比手动创建Calendar对象更高效。- 手动加载NodaTime.dll可避免PowerShell自动加载依赖时可能出现的版本不匹配问题。
内容的提问来源于stack exchange,提问作者aristosv
相关产品推荐
相关产品推荐

