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相关资料,方便进一步理解和研究: