SSIS脚本任务参考dll以编程方式

问题描述

我已经构建了能够自动导出DTSX软件包的软件。除其他对象外,该程序包还具有ScriptTask(C#)。所有这些都已编译并可以正常运行。

现在,新的要求是在该ScriptTask中调用一个类,该类存在于我们构建的外部DLL中,因此其他应用程序可以使用相同的代码。我们做了功课,并在软件安装过程中成功地将此DLL包含在GAC中。

问题在于脚本中仍无法识别“使用我们的库”。

在进行一些搜索时,我们发现,我们还需要在References文件夹内引用此DLL。我们当然可以通过DataTools / VisualStudio UI来做到这一点。

问题在于我们需要以编程方式执行此操作:

我们有这段代码可以生成项目

task.ScriptingEngine.vstaHelper.LoadNewProject(task.ProjectTemplatePath,null,"MyScriptProject");

而且,我们有这段代码可以创建MainScript

task.ScriptingEngine.vstaHelper.AddFiletoProject(ScriptName + ".cs",MainScript.ToString());

我无法弄清楚如何以编程方式包括参考DLL。

解决方法

更新后的答案

您可以通过替换DTSX文件中的相应XML节点来以编程方式更新脚本任务

节点路径取决于SSIS包中脚本任务的创建位置,在我的情况下,节点路径是

/DTS:Executable/DTS:Executables/DTS:Executable/DTS:ObjectData/pipeline/components/component[@refId="Package\Data Flow Task\Script Component"]/properties

您要查找的@refId将以Package \ Dataflow name \ Component name开头

enter image description here

此节点将具有包含C#脚本以及基于此脚本构建的二进制文件的子节点

属性名称“ SourceCode”在名为arrayElements的数组中包含C#密码,该数组将为每个文件包含三个子节点,这些子节点称为arrayElement,第一个值是相对路径和名称,第二个是文件编码,第三是文件内容

SourceCodeNode

属性名称“ BinaryCode”包含从脚本构建的.dll,还包含带有两个条目的arrayElement数组,第一个为dll名称,第二个为base64编码的dll二进制文件

BinaryCodeNode

要获取用于填充这些项目的数据,您将需要创建C#构建目录的模板,应用更改,构建代码并获取生成的文件并将其替换在相应的节点上

要创建模板,请通过SSIS任务打开脚本,

  1. 在解决方案资源管理器中单击项目,然后保存文件VstaProject.sln SaveSLN
  2. 转到已保存的文件夹,您可以从解决方案属性对话框中删除该文件夹 FindTheFolder
  3. 将此文件夹复制到某个位置,以便您可以重复使用它来构建自定义内容
  4. 修改模板目录中的.cs文件,并将自定义引用dll添加到.csproj文件中
  5. 在与.csproj相同的目录中调用MSBUILD以输出dll,重要的是要使用VS MSBUILD,VS2017可以在
  6. 中找到它

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe

  1. 获取这些文件并将其打包到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;
}