【问题标题】:"Runtime error Exception has been thrown by the target of an invocation" from Script task脚本任务中的“调用目标引发了运行时错误异常”
【发布时间】:2015-05-13 21:04:11
【问题描述】:

我有一个带有脚本任务的 SSIS 包,当我尝试在本地系统中运行它时出现以下错误。它适用于我的同事以及生产环境。但是,我无法在本地运行它来测试。我在 main 方法中保留了一个调试点,但从未到达,在它进入 main 方法之前我得到了错误。

我正在使用 VS 2010,.Net 框架 4.5。

脚本任务会编译。我收到以下消息 SSIS 包“..\Test.dtsx”开始。错误:0x1 测试:调用目标已引发异常。任务失败:测试 SSIS 包“..\Test.dtsx”完成:成功。程序“[2552] DtsDebugHost.exe: DTS”已退出,代码为 0 (0x0)。

以下是代码:

public void Main()
{
try
{
 LogMessages("Update Bug package execution started at :: " + DateTime.Now.ToLongTimeString());
 LogMessages("Loading package configuration values to local variables.");

strDBConn = Dts.Variables["User::DBConnection"] != null ? Dts.Variables["User::DBConnection"].Value.ToString() : string.Empty;
strTPCUrl = Dts.Variables["User::TPCUrl"] != null ? Dts.Variables["User::TPCUrl"].Value.ToString() : string.Empty;

TfsTeamProjectCollection objTPC = new TfsTeamProjectCollection(new Uri(strTPCUrl));
WorkItemStore objWIS = new WorkItemStore(objTPC);
WorkItemCollection objWIC = objWIS.Query("SELECT...");

foreach (WorkItem wi in objWIC)
{
}

}
catch(Exception ex)
{
}

当我从 TfsTeamProjectCollection 注释代码时 objTPC = new TfsTeamProjectCollection(new Uri(strTPCUrl));脚本成功执行。但是,如果我保留 TfsTeamProjectCollection objTPC = new TfsTeamProjectCollection(new Uri(strTPCUrl));并评论其余的,我得到了例外。 我确实可以访问该 URL。

我在脚本任务中使用 Microsoft.TeamFoundation.Client.dll 和 Microsoft.TeamFoundation.WorkItemTracking.Client.dll。但是包中的dll版本是10.0,而我的GAC中的dll版本是12.0。会不会有问题?

【问题讨论】:

  • 我们也很困惑。也许是由于问题中缺少代码。否则,我们无法提供权威的答案。它可能安装在那些机器上的自定义 DLL/3rd 方软件不在你的机器上,但这只是猜测
  • 哇,这并没有给你太多的继续,不是吗?当您在 SSDT 中运行它(在调试模式下)时,您是否梳理了所有写入 DEBUG 窗口的消息?这将是您找到有关调用目标实际抛出的异常的线索的最佳选择。
  • 另外,您能否验证脚本任务将在您的机器上编译?
  • 脚本任务会编译。我收到以下消息 SSIS 包“..\Test.dtsx”开始。错误:0x1 测试:调用目标已引发异常。任务失败:测试 SSIS 包“..\Test.dtsx”完成:成功。程序“[2552] DtsDebugHost.exe: DTS”已退出,代码为 0 (0x0)。
  • 如果它是一个脚本任务,您可以在 Visual Studio 中创建一个简单的控制台应用程序,尝试一下并在您收到此消息时亲自查看错误。我相信当您尝试调用您无法调用的内容时会引发上述异常。

标签: c# ssis script-task


【解决方案1】:

我遇到了同样的问题(即相同的错误代码 Error: 0x1 ...)。

问题在于从缺少的文件夹中引用的一些库。

删除引用并将它们从正确的路径添加回来解决了这个问题。

与错误代码相关的 Microsoft 参考 (https://msdn.microsoft.com/en-us/library/ms345164.aspx) 非常通用,对您没有多大帮助。 但是,阅读其他文章很可能表明运行脚本任务的失败原因未知。

  • 十六进制代码:0x1
  • 十进制代码:1
  • 符号名称:DTS_MSG_CATEGORY_SERVICE_CONTROL
  • 说明:函数不正确。

【讨论】:

    【解决方案2】:

    当我在 Dts.Variables["User::xxxx].Value(); 中引用传递的 ssis 变量时收到此错误消息,其中 xxxx 不存在并且不是从调用程序传递的。这很简单Console.Writeline 引用了一个不存在的传递变量。

    【讨论】:

      【解决方案3】:

      我通过更改 SSIS 项目TargetServerVersion 修复了此错误。

      Integration Services Project Property Pages

      【讨论】:

      【解决方案4】:

      这只是一种不同的情况,并不打算成为所有人的全部解决方案。

      当我将我的 DLL 安装到 GAC 中时,我忘记以管理员身份运行我的脚本,并且该脚本无声无息地运行,就好像它正在运行一样。

      当我意识到我做错了什么时,我感到非常愚蠢。希望这可以帮助防止其他人将时间浪费在如此愚蠢的事情上。

      作为参考,这是我用于将我的 DLL 安装到 GAC 中的内容,我对其进行了修改以告诉我现在何时不以管理员身份运行它:

      #https://superuser.com/questions/749243/detect-if-powershell-is-running-as-administrator
      $isAdmin = ([Security.Principal.WindowsPrincipal] `
        [Security.Principal.WindowsIdentity]::GetCurrent() `
      ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
      
      if($isAdmin -eq $false)
      {
          Write-Host "You have to run this script as Administrator or it just won't work!" -ForegroundColor Red
      
          return;
      }
      
      $strDllPath = "C:\PathToYourDllsHere\"
      
      #Note that you should be running PowerShell as an Administrator
      [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")            
      $publish = New-Object System.EnterpriseServices.Internal.Publish            
      
      
      $arr = @(
          "YourDLL01.dll",
          "YourDLL02.dll",
          "YourDLL03.dll"
      )
      
      get-date
      
      foreach($d in $arr)
      {
          $p = ($strDllPath + $d);
      
          $p
      
          $publish.GacInstall($p);
      }
      
      #If installing into the GAC on a server hosting web applications in IIS, you need to restart IIS for the applications to pick up the change.
      #Uncomment the next line if necessary...
      #iisreset
      

      感谢如何确定您的 PowerShell 脚本是否在管理员模式下运行: https://superuser.com/questions/749243/detect-if-powershell-is-running-as-administrator

      【讨论】:

        【解决方案5】:

        在我的情况下,缺少 DLL 或服务器上没有安装正确的版本。

        本地所有测试都很好,但在服务器上,错误消息Runtime error Exception has been thrown by the target of an invocation 不断弹出。

        没有异常处理程序能够捕获该错误 - 脚本任务中的代码甚至不会被执行,只要需要一个 DLL,它不在服务器上的程序集缓存中(它可能发生在一台本地机器,同样的错误)。

        这里的困难在于找出缺失的内容,然后更新对正确版本的引用,或者使用gacutil 在程序集缓存中安装缺失的 DLL。我进行调试的方法是删除脚本任务中的部分代码,直到不会出现该错误,然后分析缺少的部分以供参考。

        【讨论】:

          【解决方案6】:

          在这里的其他答案没有任何运气之后,我终于发现在我的包中,问题是我创建了一个新变量,但没有将它的名称带到我的 C# 脚本的新副本中。变量是用作连接字符串表达式的变量。所以这最终是一个改变的问题:

          Dts.Variables["Exists"].Value = File.Exists(Dts.Variables["OldSSISPackageVariableName"].Value.ToString());
          

          到:

          Dts.Variables["Exists"].Value = File.Exists(Dts.Variables["NewSSISPackageVariableName"].Value.ToString());
          

          一旦我让它们保持同步,它就可以正常工作了。

          【讨论】:

          • 不知道为什么 Visual Studio 不能让自己更优雅地处理这种情况。错误消息中的隐藏字符?你是认真的吗? 7 年后还是一样。
          【解决方案7】:

          当添加对 dll 版本 12.0.0 的引用并将目标框架更改为 .Net Framework 4.5 时,它已修复

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-09-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-25
            相关资源
            最近更新 更多