SQL Server创建引用NetFwTypeLib的C#程序集失败求助
SQL Server 2005 CLR程序集依赖找不到问题排查与解决
可能原因及对应解决办法
1. 程序集名称大小写/拼写不匹配
SQL Server对程序集名称的大小写敏感(取决于数据库排序规则),错误提示中引用的是全小写的interop.netfwtypelib,但你创建的是[Interop.NetFwTypeLib],名称大小写差异会导致匹配失败。
解决办法:
- 修改创建Interop程序集的语句,使用全小写名称,与错误提示保持一致:
CREATE ASSEMBLY [interop.netfwtypelib] AUTHORIZATION dbo FROM "C:\Path\That\Go\To\My\Project\FwSetting\FwSetting\bin\Debug\Interop.NetFwTypeLib.dll" WITH PERMISSION_SET = unsafe
- 或检查你的
FwSetting.exe项目中对Interop程序集的引用名称,确保与数据库中创建的程序集名称完全一致。
2. 引用的Interop程序集与导入的不是同一文件
即使版本号显示一致,重新生成的Interop程序集可能因编译环境变化导致哈希值不同,SQL Server会判定为不同程序集。
解决办法:
- 将
FwSetting.exe同目录下的Interop.NetFwTypeLib.dll复制到导入路径,确保导入的是项目实际引用的文件; - 使用
sn -T Interop.NetFwTypeLib.dll命令(需安装.NET Framework SDK)查看公钥令牌,确认其为null(与错误提示一致,说明是无强名程序集),若不一致则说明引用的不是同一文件。
3. 重新按依赖顺序部署程序集
有时残留的程序集元数据会导致加载异常,建议先清理现有程序集,再严格按依赖顺序重新创建:
USE gdt -- 先删除主程序集,再删除依赖 DROP ASSEMBLY IF EXISTS FwSetting DROP ASSEMBLY IF EXISTS WindowsForm DROP ASSEMBLY IF EXISTS [interop.netfwtypelib] -- 按依赖顺序重新创建 CREATE ASSEMBLY [interop.netfwtypelib] AUTHORIZATION dbo FROM "C:\Path\That\Go\To\My\Project\FwSetting\FwSetting\bin\Debug\Interop.NetFwTypeLib.dll" WITH PERMISSION_SET = unsafe CREATE ASSEMBLY WindowsForm AUTHORIZATION dbo FROM "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll" WITH PERMISSION_SET = unsafe CREATE ASSEMBLY FwSetting AUTHORIZATION dbo FROM "C:\Path\That\Go\To\My\Project\FwSetting\FwSetting\bin\Debug\FwSetting.exe" WITH PERMISSION_SET = unsafe
4. SQL Server服务账户权限问题
Interop程序集最终要调用系统COM组件(防火墙API),如果SQL Server服务账户没有访问firewallapi.dll的权限,也可能导致依赖加载失败。
解决办法:
- 确认SQL Server服务账户(默认是NT SERVICE\MSSQLSERVER)对
C:\Windows\System32\firewallapi.dll有读取权限; - 确保操作账户拥有
sysadmin服务器角色权限,避免权限不足导致的部署失败。
额外注意事项
- 禁止在触发器中运行Windows Forms:SQL Server是服务端进程,无桌面交互权限,Windows Forms程序在服务端运行会无UI输出,甚至引发进程异常,建议将UI逻辑移除,改为纯后台处理;
- SQL Server 2005安全风险:该版本已停止官方支持,存在安全漏洞,建议尽快升级到更高版本;使用
UNSAFE权限的CLR程序集会带来潜在安全风险,需谨慎评估。
内容的提问来源于stack exchange,提问作者whitesky12
相关产品推荐
相关产品推荐

