SSIS:如何调试在脚本组件内部引用的自定义程序集
Posted
技术标签:
【中文标题】SSIS:如何调试在脚本组件内部引用的自定义程序集【英文标题】:SSIS: How to debug a custom assembly that is referenced inside of a script component 【发布时间】:2021-12-30 15:08:45 【问题描述】:我能够调试通过 Visual Studio 的 Attach to Process
功能添加到 SSIS 的自定义组件。
但是,是否可以在 SSIS 包的脚本组件(即数据流中的 C# 脚本)内部执行自定义程序集时对其进行调试?如果是,怎么做?
我尝试了以下方法但没有成功:
-
使用断点构建程序集(请参阅本问题底部的注释)*
启动 SSIS 包并在断点处停止执行
已将打开程序集文件的 Visual Studio 实例附加到正在运行 SSIS 包的 DtsDebugHost.exe 执行实例
程序集文件中的所有断点都切换到说:
当前不会命中断点。没有为此文档加载任何符号。
我应该加载哪些符号?我检查了模块窗口,但加载三个程序集没有帮助,当我尝试为两个 SqlServer DTS 程序集加载符号时,它需要我选择一个具有相同文件名和文件类型的非常特定的文件,其中两者似乎都是临时的文件名 - 我不知道在这里加载什么。
*注意:我在自定义程序集上设置了以下构建后事件:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\gacutil.exe" -u $(TargetName)
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\gacutil.exe" -i $(TargetFileName)
copy $(TargetFileName) "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8"
copy $(TargetFileName) "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\SSIS\150\Binn"
更新 1
在发布此问题之前,我还尝试将程序集的源代码文件添加到脚本组件中,但这会导致引发与我尝试调试的原始错误无关的其他错误。程序集中有很多递归,它也有尝试加载它自己的程序集的代码。我无法准确理解是什么导致了不相关的错误。所以,我放弃了那条路线。
还有一点可能值得一提,如果不是严格地出于程序员的幽默,这个程序集非常古老,几乎没有代码 cmets。当我在我们的代码仓库中发现它的源代码时,它不会打开,因为它仍然针对 .NET Framework 2.0,甚至无法从 Microsoft 下载。我不得不升级它,所以我选择了 .NET Framework 4.8。我尝试切换到 4.7,因为脚本组件默认以 4.7 为目标,并且这种方式有点硬编码,因为每次我保存并重新打开它时,它都会降级回 4.7。但是,.NET Framework 版本都没有解决我在脚本组件中调试程序集的能力。
所以,我求助于添加文本文件写入行,以输出代码在出错之前到达的位置。这是调试恕我直言的蹩脚方式。
更新 2
我尝试加载Microsoft.SqlServer.ManagedDTS.dll
的符号,打开文件对话框窗口正在寻找Microsoft.SqlServer.ManagedDTS.pdb
或Microsoft.SqlServer.ManagedDTS.dbg
。我进入C:\Program Files (x86)\
并运行以下命令:
dir /s /b Microsoft.SqlServer.ManagedDTS.pdb
dir /s /b Microsoft.SqlServer.ManagedDTS.dbg
但是,对两者的响应都是File Not Found
。有什么想法吗?
【问题讨论】:
脚本任务是一个输出类型为类库的 .NET 项目。当我在你的位置(SQL 2005/2008 时代)时,我伪造了它。我有一个用来模拟环境的控制台应用程序。想到的另一种方法是将您的项目添加到现有的脚本任务中。这样,当 SSIS 任务构建并且您退出时,所有源代码 - 您的和任务将被序列化到 SSIS 包中。在装配问题上,我认为这是您在任务空间中想要的 ManagedDTS。组件需要运行时和 tx?命名程序集 @billinkc 我尝试将程序集源代码文件添加到脚本组件中,但这导致抛出与我尝试调试的原始错误无关的其他错误。程序集中有很多递归,它也有尝试加载它自己的程序集的代码。所以,我放弃了这条路线。关于您的最后一点,您能否提供有关如何为 ManagedDTS 加载符号的答案?它会打开一个窗口来查找特定的、随机的文件名。我以前没有这样做过。谢谢。 取决于您安装的内容,但请尝试C:\Program Files (x86)>dir /s /b Microsoft.SqlServer.ManagedDTS.dll
C:\Program Files (x86)\Microsoft SQL Server\150\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\SSIS\140\Microsoft.SqlServer.ManagedDTS.dll
@billinkc 我已经尝试了您的建议并针对我的问题发布了更新(即更新 2)。非常感谢您提供的任何帮助或建议。
我不知道我在Visual Studio下是怎么得到这个DLL的副本的。我认为 SQL Server 下的存在与我安装 SQL Server 开发人员版有关,作为其中的一部分,我选择了“安装 SQL Server 集成服务服务”,但这些只是猜测
【参考方案1】:
在执行 SSIS 包期间,我无法找到调试程序集的方法。正如@billinkc 之前建议的那样,我必须从 SSIS 包中检索行的数据,然后通过控制台应用程序将其输入到程序集中。我会留下这个问题。如果以后有人有更好的答案,请分享。
【讨论】:
以上是关于SSIS:如何调试在脚本组件内部引用的自定义程序集的主要内容,如果未能解决你的问题,请参考以下文章
在 SSIS 2005 的脚本任务中引用 .net 3.5 程序集?
Visual Studio 2015 Integration Services项目不会选择我的自定义SSIS组件