gpt4 book ai didi

c# - 在 SSIS 脚本任务静态构造函数中访问可配置值

转载 作者:行者123 更新时间:2023-11-30 18:11:33 26 4
gpt4 key购买 nike

我有一个 SSIS 包,其中包含需要第 3 方程序集的脚本任务。由于不允许我将此程序集放置在 SSIS 服务器上的 GAC 中,因此我在运行时将程序集绑定(bind)到脚本任务的静态构造函数中。这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 代码所在的目录。

我没主意了。这可能吗?

最佳答案

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

在“初始化”脚本任务中,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 代理设置:
  • 在不需要程序集的初始任务中,我们使用具有 DTS 访问权限的 Main() 将我们的路径粘贴到 EnvironmentVariable,范围限定为进程(以防止泄漏到其他并发执行)。
  • 就是这样,现在收获努力......我们的库路径将在所有其他下游任务的静态构造函数中访问。

关于c# - 在 SSIS 脚本任务静态构造函数中访问可配置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com