混合SSIS / DLL解决方案的自动化部署

9
我们目前使用SSIS / C#开发了一种解决方案。其中,SSIS包(除其他功能外)还有一个脚本任务,使用在类库中开发的逻辑。此功能需要与SSIS包保持独立。
因为我们使用SSIS包,我理解编译后的DLL文件需要部署到GAC,然后从脚本任务中进行引用。但是这对我们来说会造成部署问题。
我们的自动化部署工具(正确地)会自动增加DLL文件的版本号,然后发布到GAC。然而,这会破坏SSIS包,因为它会尝试基于它们在开发机器GAC上发布的版本号访问DLL文件。
我们唯一的解决方法是获取已编译的DLL文件,手动修改SSIS包脚本任务,然后发布该包。
看起来似乎应该有更好的方法来完成这个过程,有没有人遇到过这个问题并想出了更好的解决方案?或者除消除DLL文件需求之外,我们的方法是否需要做出根本性改变?
谢谢!
4个回答

10

经过大量的研究,我并没有找到一个令人满意的解决方案。最终,我能够获得的最接近的解决方案是动态加载我的引用:

    Dim rsAssembly As Assembly = Assembly.LoadFile("path from config file")
    Dim rsType As Type = rsAssembly.GetType("class name from config file")
    Dim obj As Object = Activator.CreateInstance(rsType)

通过这种方式,我成功创建了所需的对象(值得注意的是,任何其他依赖项引用也需要动态加载或成为GAC的一部分,但至少没有依赖版本号)。

我把这个信息发布在这里,供将来寻找答案的人参考,但如果有人想出更好的解决方案,我仍然非常想知道你是如何解决的 - 在这里发布,我会将答案归功于你 :)


4
在我的情况下,仅调用Assembly.LoadFile是不起作用的。有效的方法是这样的:
在类构造函数中调用此方法:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

然后使用这个方法,包含你所需要的所有DLL文件:

 private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
 {
     if (args.Name.Contains("libName.dll"))
         return Assembly.LoadFile(System.IO.Path.Combine(_libraryFolder, "libName.dll"));

     if (args.Name.Contains("libName2.dll"))
         return Assembly.LoadFile(System.IO.Path.Combine(_libraryFolder, "libName2.dll"));

     return null;
 }

如果有很多个,您可能需要使用 List<string> 对其进行重构。

1
我注意到我们的SSIS/C#混合使用中存在类似的问题。我们还依赖于一个外部(对于SSIS来说)的dll。在我们的情况下,必须将DLL复制到100/DTS/Binn目录中,以允许SSIS包在Visual Studio内工作,但是当我们尝试使用SQL Package Execution Utility运行包时,会出现文件找不到的错误。它似乎并不表明版本问题,而是Visual Studio和Package Execution Utility之间路径差异的问题。即使从Visual Studio中不带调试运行包也可以正常工作。我将研究版本问题,看看是否可能是我们系统的核心问题,但是从记忆中我认为这是一个影响我们的文件未找到类型的错误。我们正在使用MSSQL 2008,如果有区别的话。

1
在后续的工作中,我通过将DLL复制到主机机器的windows\assembly目录中成功执行了该软件包。显然,这是一个难以捉摸的GAC位置?无论如何,我们的部署机制尚不够自动化,因此可能这就是我们没有版本问题的原因。一旦我将dll复制到windows\assembly目录中,软件包就能运行完成。 - Travis
1
嗨Travis - 是的,那是GAC的位置,不确定SQL 2008的限制,但如果有帮助的话,我可以确认在SQL 2005上部署的服务器中,DLL必须部署到GAC :( - Chris

0

你确定那些共享的 DLL 必须部署到 GAC 吗?如果它们与 SSIS 包在同一个文件夹中,框架应该能够发现它们,而无需将它们添加到 GAC。

难道没有办法更新您的构建系统以避免版本号更改吗?如果这些程序集的代码没有更改,就没有必要更新版本号。

如果无法避免版本号增加,另一种选择是在共享程序集中构建策略文件,并使用它来“重定向” SSIS 包到每个构建的新版本。


我所知道的是SSIS包必须部署到GAC,如果不是那就太好了-但你确定吗?http://www.developerdotstar.com/community/node/333 版本号-我猜我们可以这样做,但这个想法让我有点不舒服。我以前没有使用过策略文件,我会去看看它们,谢谢。 - Chris
我还没有尝试过带有外部依赖的SSIS包,所以不确定。使用依赖项构建模拟包并进行快速烟雾测试应该相当容易... - Dave Swersky
嗨,戴夫 - 我一直在研究与SSIS解决方案相关的策略文件,但我真的不知道如何引入一个而不创建另一个依赖项。也许我错过了什么,但如果您有关于如何将它们与SSIS包一起使用的其他信息,那将不胜感激! - Chris
是的,我们尝试了不使用GAC进行冒烟测试,但我们采取的方法都失败了。我们能想到的唯一另一种方法是使用反射从文件位置动态加载类 - 但这似乎也是一个绕过此问题的极端方式。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接