访问SSIS脚本任务静态构造函数中的可配置值

问题描述 投票:2回答:1

我有一个带有脚本任务的SSIS程序包,需要第三方组装。由于不允许将该程序集放在SSIS服务器上的GAC中,因此我在运行时将程序集绑定到脚本任务的静态构造函数中。这是我用作指导的article。但是,我想找到一种方法来避免硬编码程序集文件的路径。

我的工作代码如下:

  static ScriptMain()
     {
         AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
     }
     static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
     {
         if (args.Name.Contains("thirdparty"))
         {
             string path = @"C:\mydrive\Solution\Reference";
             return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "thirdparty.dll"));
         }
         return null;
     }

我尝试过的:

1)将路径设置为包变量。这不起作用,因为在静态构造函数运行时Dts对象尚未实例化,因此无法访问包变量。

2)尝试访问正在触发程序集解析事件的应用程序域,如下所示:

string appDomainPath = ((AppDomain)sender).BaseDirectory;

但是这只是获取VSTA代码所在的目录。

我没主意了。这甚至可能吗?

c# .net ssis assemblies ssis-2016
1个回答
0
投票

可以利用环境将包变量潜入静态构造函数中:

在“初始化”脚本任务中,Main():

Environment.SetEnvironmentVariable("LIBRARY_PATH", Dts.Variables["$Package::LIBRARY_PATH"].Value.ToString(), EnvironmentVariableTarget.Process);

然后在将来的脚本组件/任务中的任何地方

        static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string library_path = Environment.GetEnvironmentVariable("LIBRARY_PATH", EnvironmentVariableTarget.Process);
            /* ...
               ... */
        }

注意:

  • 首选使用程序包变量,因为它可以根据环境进行覆盖并通过SQL Server代理进行设置:
  • [在不需要组装的初始Task中,我们将路径粘贴到EnvironmentVariable中,并使用具有DTS访问权限的Main()将其范围限定为该过程(以防止泄漏到其他并发执行中。)>
  • 就这样,现在就可以付出努力了……在其他所有下游任务中,我们的库路径都可以在静态构造函数中访问。
© www.soinside.com 2019 - 2024. All rights reserved.