更新答案
您可以通过替换 DTSX 文件中的相应 XML 节点以编程方式更新脚本任务
节点路径取决于在 SSIS 包中创建脚本任务的位置,在我的例子中节点路径是
/DTS:Executable/DTS:Executables/DTS:Executable/DTS:ObjectData/pipeline/components/component[@refId="Package\Data Flow Task\Script Component"]/properties
您要查找的@refId 将以包\数据流名称\组件名称开头
此节点将具有包含 C# 脚本以及基于此脚本构建的二进制文件的子节点
属性名称“SourceCode”包含一个名为arrayElements的数组中的C# scipts,该数组将为每个文件有三个子节点,这些子节点称为arrayElement,第一个值是相对路径和名称,第二个是文件编码和三是文件内容
属性名称“BinaryCode”包含从脚本构建的 .dll,它还包含一个带有两个条目的 arrayElement 数组,第一个是 dll 名称,第二个是 base64 编码的 dll 二进制文件
要获取数据以填充这些项目,您需要创建 C# 构建目录的模板、应用更改、构建代码并获取生成的文件并在相应的节点上替换它们
要创建模板,请通过 SSIS 任务打开脚本,
- 在解决方案资源管理器中单击项目并转到文件保存 VstaProject.sln
- 转到保存的文件夹,您从解决方案属性对话框中获取该文件夹
- 将此文件夹复制到某处,以便您可以重复使用它来构建您的自定义内容
- 修改模板目录中的 .cs 文件并将自定义引用 dll 添加到 .csproj 文件中
- 调用与你的.csproj同目录的MSBUILD输出dll,重要的是你使用VS MSBUILD,VS2017你可以在
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe
- 获取这些文件并将它们打包到 DTSX 文件中的 XML 节点中
初步回答
Microsoft 为加载不在 GAC 中的 DLL 提供了一种解决方法
Load assembly that isnt in the GAC
请参阅下面的 SSIS 脚本摘录,我从 nuget 安装目录加载了 JSON dll。此 DLL 不在 GAC 中
static ScriptMain()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.Contains("Newtonsoft.Json"))
{
string path = @"C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\";
return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "Newtonsoft.Json.dll"));
}
return null;
}