SSIS调用外部dll,导致作业失败,加载dll失败( eg NPOI)
以下两种方式:
1.注册GAC 方式(本人使用失败后,没采取此方式,由于需要强签名Dll 才可以);
2.注册一个AppDomain.AssemblyResolve事件处理程序
- .NET Framework为需要更好地控制程序集加载的应用程序提供了AppDomain.AssemblyResolve事件。通过处理此事件,您的应用程序可以从正常探测路径外部将程序集加载到加载上下文中,从多个程序集版本中选择要加载的版本,发出动态程序集并返回它,依此类推。
- 问题是在哪里以及如何连接它。诀窍是要认识到.NET的即时(JIT)编译负责加载依赖的程序集,因此可以保证在执行该方法之前,不会加载类型方法中引用的程序集。这意味着在类型的静态构造函数中,我们可以可靠地连接AssemblyResolve事件,该事件将提供引用的类型。
- 当您创建SSIS脚本任务或脚本组件时,SSIS会为您生成一个名为ScriptMain的类,您可以在该类型的静态构造器中连接该事件。保证“在创建第一个实例之前或引用任何静态成员之前”将完全调用一次静态构造函数,因此要在加载相关程序集之前进行。
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.Contains("NPOI"))
{
string path = @"C:\Program Files\Microsoft SQL Server\120\DTS\PipelineComponents\";
return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "NPOI.dll"));
}
return null;
}
static ScriptMain()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
先在项目添加引用,保证代码可正常编译