SSIS 2017中.NET Standard 2.0类库依赖项无法调用的解决咨询
解决SSIS 2017中无法访问.NET Standard类库依赖项的问题
方案一:将所有依赖项合并为单个DLL
完全可以把类库及其所有依赖项打包成一个独立的DLL,以此规避SSIS加载依赖时的路径问题,具体实现有两种方式:
1. 使用ILMerge工具
- 确保你的类库和所有依赖项都是强签名的(若要放入GAC则必须满足此条件)
- 安装ILMerge后执行以下命令:
注意:替换命令中的依赖项文件名,ilmerge /out:TestName.Merged.dll TestName.dll Dependency1.dll Dependency2.dll Dependency3.dll Dependency4.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /wildcards/targetplatform指定为SSIS 2017对应的.NET Framework版本(4.7.2),同时排除系统自带的程序集(如System.*类库),避免合并冲突。 - 将合并后的
TestName.Merged.dll放入GAC或SSIS执行目录即可。
2. 通过Visual Studio项目配置自动合并
- 在类库项目的
.csproj文件中添加以下MSBuild配置:
配置完成后,每次编译项目时会自动合并输出目录下的所有依赖DLL(排除系统程序集),生成合并后的文件。<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <Target Name="MergeAssemblies" AfterTargets="Build"> <Exec Command="ilmerge /out:$(OutputPath)\TestName.Merged.dll $(OutputPath)\TestName.dll $(OutputPath)\*.dll /targetplatform:v4, C:\Windows\Microsoft.NET\Framework\v4.0.30319 /exclude:System.*,Microsoft.*" /> </Target>
方案二:不合并DLL,手动关联依赖项
若不想合并DLL,可通过以下方式让SSIS正常加载依赖项:
- 将依赖DLL放入SSIS执行目录:把所有依赖项(
Dependency1.dll、Dependency2.dll等)复制到SSIS包的默认执行路径,通常为C:\Program Files\Microsoft SQL Server\140\DTS\Binn(SSIS 2017对应SQL Server 140版本);若部署到SQL Server集成服务目录,需将依赖DLL放到对应执行节点的目录中。 - 将依赖项注册到GAC:确保所有依赖DLL均为强签名,使用
gacutil /i Dependency1.dll命令逐个将依赖项注册到全局程序集缓存,SSIS即可通过GAC找到这些依赖。 - 使用程序集解析事件:在类库代码中添加
AssemblyResolve事件处理,当SSIS找不到依赖时手动从指定路径加载:
此方式需提前确定依赖DLL的固定存放路径。static TestName() { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { string assemblyPath = @"C:\YourDependencyPath\" + new AssemblyName(args.Name).Name + ".dll"; if (File.Exists(assemblyPath)) { return Assembly.LoadFrom(assemblyPath); } return null; }; }
注意事项
- SSIS 2017基于.NET Framework 4.7.2,需确保所有依赖项均兼容该版本,避免出现兼容性问题。
- 所有要放入GAC的程序集必须是强签名的,若依赖项无强签名,需重新签名这些依赖,或选择合并方案规避。
内容的提问来源于stack exchange,提问作者Denys
相关产品推荐
相关产品推荐

