由于从XML加载错误0xC0011008错误,程序包未能加载

环境:

我们的ASP.NET应用程序需要使用ManagedDTS.dll程序集来执行SSIS程序包。 我们正在BIDS 2008(而不是2005年)开发SSIS包,以便导入/导出Excel 2007-2010文件。 我们的ASP.NET应用程序正在Visual Studio .NET 2010中编译为.NET Framework 4代码。 我在32位Windows 7开发机器上引用了以下版本的ManagedDTS.dll。

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll 

我们将应用程序部署到Windows 2008 64位服务器。 该服务器上的IIS 7用于在32位或64位模式下切换运行我们的应用程序。

当我们以64位模式运行应用程序并执行SSIS包时,包正确parsing。 但是,它提供了一个运行时错误,告诉我们在64位版本的SSIS中不支持Excel连接pipe理器。 但这不是我现在需要解决的问题。

真正的问题在于应用程序以32位模式运行时执行程序包。 执行抛出一个未处理的exception,它给出了这个错误信息:

 The package failed to load due to error 0xC0011008 “Error loading from XML. No further detailed error information can be specified for this problem because no Events object was passed where detailed error information can be stored.”. This occurs when CPackage::LoadFromXML fails. 

这个错误信息让我觉得这个包是由SSIS 2005 XMLparsing器parsing的。 这应该是不可能的,因为我已经完全卸载SSIS 2005。

有趣的一点信息

于是我创build了一个全新的空白包,并用它replace了真正的包。 它工作正常。 我现在已经确定,只有在包中存在连接pipe理器时,错误才会显示。 这支持我的理论,在32位模式下,软件包正在被一个stream氓SSIS 2005 dllparsing,2008年的连接pipe理器部分与其2005版本的xml完全不同。 只是我的理论。

不为我启动

可能有些人会build议通过32位版本的DTExec从命令行运行软件包。 虽然这肯定会起作用(我已经证实了这一点),但这不是我的解决scheme。 我需要从进程中的代码运行包,以便应用程序可以轻松地获取和设置包中定义的全局variables。 从命令行运行包,对我来说,似乎是解决不应该存在的问题的解决方法。

有任何想法吗?

那么,事实certificate这是一个授权或身份问题。 我的应用程序将Thread.CurrentPrincipal设置为每个请求上的自定义IPrincipal实例。 下面是代码的解释:

 Public Class AppPrincipal Implements IPrincipal ... End Class 

…然后在Global.asax.vb中

 Sub Global_AcquireRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.AcquireRequestState Thread.CurrentPrincipal = New AppPrincipal() End Sub 

我的猜测是,ManagedDTS.dll程序集将无法打开(或parsing)SSIS包,因为它无法parsing“AppPrincipal”身份。 这是我的猜测。 解决这个问题的方法就是停止变异Thread.CurrentPrincipal。