我们目前使用SSIS / C#开发了一个解决方案。 SSIS包(以及其他内容)具有使用类库中开发的逻辑的脚本任务。此功能需要与SSIS包保持独立。
因为我们正在使用SSIS包,所以我知道编译后的DLL需要部署到GAC,然后从脚本任务中引用。但是,这会给我们带来部署问题。
我们的自动部署工具(正确)会自动增加DLL的版本号,然后将其发布到GAC。但是这打破了SSIS包,因为它将尝试根据它们发布到开发机器GAC的版本号来访问DLL。
我们唯一的解决方案是获取已编译的DLL,手动修改SSIS包脚本任务,然后发布包。
似乎必须有更好的方法来做到这一点 - 有没有人遇到过这个问题并想出更好的解决方案?或者我们需要改变的方法有哪些基础(除了消除对DLL的需求)?
谢谢!
答案 0 :(得分:8)
嗯,经过大量研究后,我从来没有真正想出一个满意的解决方案。最后,我能得到的最接近的是一个解决方案,我动态加载我的引用:
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,尽管至少没有对版本号的依赖)。
在这里发布给未来的求职者,但是如果有人想出更好的东西,我仍然会非常好奇地知道你是如何解决的 - 发布在这里,我会相信你的答案:)
答案 1 :(得分:2)
在我的情况下,只是致电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>
重构它。
答案 2 :(得分:1)
我注意到我们的SSIS / C#mix存在类似问题。我们还依赖外部(到SSIS)dll。在我们的例子中,必须将DLL复制到100 / DTS / Binn目录以允许SSIS包在Visual Studio中工作,但是当我们尝试使用SQL Package Execution Utility运行包时,我们会得到一个错误。找不到该文件。它似乎并不表示版本问题,而是Visual Studio和Package Execution Utility之间的PATH差异。甚至在没有Visual Studio调试的情况下运行包。我将调查版本问题,看看是否可能是我们系统的核心投诉,但是从内存中我认为这是一个文件未找到类型错误影响了我们。我们正在使用MSSQL 2008,如果这有所不同。
答案 3 :(得分:0)
您是否完全确定这些共享DLL必须部署到GAC?如果它们与SSIS包位于同一文件夹中,则框架应该可以发现它们,而无需将它们添加到GAC。
是否无法更新构建系统以避免版本号更改?如果这些程序集的代码没有更改,则无需更新版本号。
如果无法避免版本增量,另一种方法是与共享程序集一起构建策略文件,并使用它将SSIS包“重定向”到每个构建的新版本。