在生产部署包时,如何避免在脚本任务的添加引用中手动浏览 DLL?
How to avoid manually browsing DLL in Add Reference of Script Task when deploying package on production?
我使用 EPPlus.dll 库动态生成 Excel 附件文件,并在 SSIS 包的脚本任务中生成邮件程序。
当邮件程序有新的更改需求时,我在本地机器上的脚本任务中进行更改,并将构建的包文件 ( .dtsx ) 发送给 DBA 团队进行部署。
现在每次我都需要让 DBA 团队与我共享生产服务器屏幕时,我会:
- 在 Visual Studio Data Tools 解决方案中打开文件
- 浏览到 dll 位置
- 在脚本任务中添加对 dll 的引用。
然后他们从计划的作业引用并执行包的地方导入 MSDB 中的包文件。
如果我不执行上述步骤,脚本任务会抛出找不到引用的错误。
Error 1 The type or namespace name 'OfficeOpenXml' could not be found
(are you missing a using directive or an assembly reference?)
我克服了在脚本任务中通过动态加载程序集在 GAC 中安装 DLL 的挑战,如下所示'
public void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(strDLLPath, "EPPlus.dll"));
}
但我无法找到避免手动浏览和添加 DLL 引用的步骤。请帮助,因为 DBA 团队不愿意/避免共享屏幕。
或者,如果我不能直接访问生产服务器,correct/best 将包文件部署到使用外部 dll 的服务器上的实践方法是什么。
我认为没有直接的方法可以从集成服务包中做到这一点,因为唯一的解决方法是 - (你使用 CurrentDomain_AssemblyResolve
函数所做的) - 从某个位置加载程序集而不是将其安装到 GAC 中。
有 3 种在部署中使用自定义 dll 的方法:
- 正在将 DLL 分配给 GAC
- 使用
AssemblyResolve
函数
- 将所有 Dll 复制到 sql 服务器 DTS 程序集文件夹 (SQL Server 2008 的示例:
C:\Program Files\Microsoft SQL Server0\DTS\Binn
) 和 . Net 框架程序集文件夹。
如果问题是要求屏幕共享,您可以创建一个小的安装向导,将这些 dll 复制到特定位置,并要求 dba 团队执行它。
解决方法
在搜索此问题时,我发现了一个有趣的解决方法,即使用 Web 服务而不是直接 dll,因此您可以创建一个包含您正在使用的方法的 Web 服务,并添加 Web 引用而不是本地程序集
旁注:我以前没有尝试过这种方法,但我只是想提供帮助
有用的链接和参考
- SSIS custom DLLs during deployment
- How to load an Assembly in a SSIS script task that isn’t in the GAC
- SQL Server SSIS Custom DLL Folders
- Using Custom DLL's in an SSIS Script Task
- Referencing Other Assemblies in Scripting Solutions
- Access WebService via SSIS Script Component
- Calling a secure webservice in SSIS through script task
- Consume Webservice via SSIS Script Component
- HOW TO: Write a Simple Web Service by Using Visual C# .NET
我使用 EPPlus.dll 库动态生成 Excel 附件文件,并在 SSIS 包的脚本任务中生成邮件程序。
当邮件程序有新的更改需求时,我在本地机器上的脚本任务中进行更改,并将构建的包文件 ( .dtsx ) 发送给 DBA 团队进行部署。
现在每次我都需要让 DBA 团队与我共享生产服务器屏幕时,我会:
- 在 Visual Studio Data Tools 解决方案中打开文件
- 浏览到 dll 位置
- 在脚本任务中添加对 dll 的引用。
然后他们从计划的作业引用并执行包的地方导入 MSDB 中的包文件。
如果我不执行上述步骤,脚本任务会抛出找不到引用的错误。
Error 1 The type or namespace name 'OfficeOpenXml' could not be found (are you missing a using directive or an assembly reference?)
我克服了在脚本任务中通过动态加载程序集在 GAC 中安装 DLL 的挑战,如下所示'
public void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(strDLLPath, "EPPlus.dll"));
}
但我无法找到避免手动浏览和添加 DLL 引用的步骤。请帮助,因为 DBA 团队不愿意/避免共享屏幕。
或者,如果我不能直接访问生产服务器,correct/best 将包文件部署到使用外部 dll 的服务器上的实践方法是什么。
我认为没有直接的方法可以从集成服务包中做到这一点,因为唯一的解决方法是 - (你使用 CurrentDomain_AssemblyResolve
函数所做的) - 从某个位置加载程序集而不是将其安装到 GAC 中。
有 3 种在部署中使用自定义 dll 的方法:
- 正在将 DLL 分配给 GAC
- 使用
AssemblyResolve
函数 - 将所有 Dll 复制到 sql 服务器 DTS 程序集文件夹 (SQL Server 2008 的示例:
C:\Program Files\Microsoft SQL Server0\DTS\Binn
) 和 . Net 框架程序集文件夹。
如果问题是要求屏幕共享,您可以创建一个小的安装向导,将这些 dll 复制到特定位置,并要求 dba 团队执行它。
解决方法
在搜索此问题时,我发现了一个有趣的解决方法,即使用 Web 服务而不是直接 dll,因此您可以创建一个包含您正在使用的方法的 Web 服务,并添加 Web 引用而不是本地程序集
旁注:我以前没有尝试过这种方法,但我只是想提供帮助
有用的链接和参考
- SSIS custom DLLs during deployment
- How to load an Assembly in a SSIS script task that isn’t in the GAC
- SQL Server SSIS Custom DLL Folders
- Using Custom DLL's in an SSIS Script Task
- Referencing Other Assemblies in Scripting Solutions
- Access WebService via SSIS Script Component
- Calling a secure webservice in SSIS through script task
- Consume Webservice via SSIS Script Component
- HOW TO: Write a Simple Web Service by Using Visual C# .NET