PowerShell加载Microsoft.SqlServer.Dac.Model.TSqlModel遇类型加载异常求助
解决加载Dacpac时的System.TypeLoadException错误
问题原因
该错误通常由.NET Framework版本兼容性、PowerShell运行环境不匹配,或是DAC组件依赖缺失导致,核心是无法正确加载System.Diagnostics.Eventing.EventDescriptor类型。
解决方法
使用Windows PowerShell 5.1而非PowerShell Core/7+
Microsoft.SqlServer.Dac.dll基于.NET Framework构建,PowerShell Core(.NET Core/.NET 5+)与该组件存在兼容性问题,务必使用Windows PowerShell 5.1执行脚本。升级.NET Framework到4.7.2及以上版本
旧版本.NET Framework可能存在类型加载的兼容性问题,可通过以下命令检查当前版本:Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version,Release -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -match '^(?!S)\p{L}' } | Select-Object PSChildName, Version, Release若版本低于4.7.2,安装最新的.NET Framework版本。
确保DAC组件与Dacpac版本兼容
你使用的是SQL Server 2022(160)的DAC组件,若Dacpac由旧版本SQL Server生成,可通过指定兼容级别解决:$modelOptions = New-Object Microsoft.SqlServer.Dac.Model.ModelLoadOptions # 指定兼容级别为SQL Server 2022,或使用Latest自动匹配 $modelOptions.SqlServerCompatibilityLevel = [Microsoft.SqlServer.Dac.Model.SqlServerCompatibilityLevel]::SqlServer2022 $model = [Microsoft.SqlServer.Dac.Model.TSqlModel]::LoadFromDacpac($dacpacFilePath, $modelOptions)加载所有依赖的DAC程序集
除已加载的两个程序集外,添加DAC目录下的其他核心依赖:Add-Type -Path 'C:\Program Files\Microsoft SQL Server\160\DAC\bin\Microsoft.SqlServer.TransactSql.ScriptDom.dll' Add-Type -Path 'C:\Program Files\Microsoft SQL Server\160\DAC\bin\Microsoft.SqlServer.Types.dll'以管理员身份运行PowerShell
权限不足可能导致程序集加载失败,右键选择Windows PowerShell并以管理员身份启动后重试脚本。修复SQL Server DAC组件
若上述方法无效,通过控制面板修复SQL Server 2022:- 打开「控制面板」→「程序和功能」
- 找到「Microsoft SQL Server 2022」,点击「更改」
- 选择「修复」,按照向导完成DAC组件的修复安装
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

