SSIS脚本任务中动态引入外部dll

目录

问题

SSIS Script Task中如果要引入第三方dll,通常可以将dll注册到GAC后引用,只要在本地和服务器上都注册,开发和部署都会比较方便,但注册GAC是需要管理员权限的,如果在受限的环境中开发,无管理员权限,则可以引入指定路径的dll。现在遇到的问题是开发环境和生产环境中dll路径无法保证一致,部署环境有一个固定的dll文件路径,但在本地开发环境中无法创建这个路径。

方案

在Script Task中动态加载dll,本地开发时从任意路径添加dll引用,让IDE有自动代码提示,运行时程序若找不到开发时添加引用的dll路径,则会按代码中指定的路径加载dll。示例代码如下:

[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
     static ScriptMain()
     {
         AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
     }
     static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
     {
         if (args.Name.Contains("ssisHelper"))
         {
             string path = @"c:\temp\";
             return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "ssisHelper.dll"));
         }
         return null;
     }
    public void Main()
    {
        . . .
    }
}

路径可以写生产环境中固定的dll路径,或者设置一个环境变量,然后通过环境变量获取,达到动态引入dll的目的:

string path = Environment.GetEnvironmentVariable("DLL_PATH");
if (String.IsNullOrEmpty(dll_path)) 
{
    path = @"your_fixed_dll_path"
}
...

参考链接

动态加载dll相关资料,方便进一步理解和研究: