这是一个令人头疼的问题。这是交易。
在将使用 Delphi 2007 for .NET 构建的 ASP.NET 应用程序的 beta 副本部署到测试服务器时,我遇到了一个奇怪的问题。该应用程序无法启动,因为它无法加载我正在使用的 ADO.NET 数据提供程序的正确版本。
只有在 bin 目录中包含旧程序集的版本,应用程序才能运行。但是,我不想被这个旧的 .NET 数据提供者所束缚,所以我决心找到解决这个问题的方法。
我最初使用 .net 数据提供程序程序集作为 Copy Local 编译项目,这应该导致 Delphi 使用我在将其添加到项目管理器中的 References 文件夹时选择的该程序集版本的副本。我选择的实际程序集是 9.10.2.0 版本,这是与应用程序一起出现在 bin 目录中的程序集版本。但是,在运行时,应用程序试图绑定到同一程序集的早期版本 9.0.2.7。
(其实这个问题不管我有没有使用 GAC 版本的 Copy Local 都会出现,所以我觉得不是这个问题。)
在调查这个问题时,我创建了一个新项目,并添加了对 9.10.2.0 程序集的引用。尽管如此,.NET 2.0 配置实用程序和反射器都显示应用程序编译时引用了 9.0.2.7 程序集。
检查 GAC 我看到 9.0.2.7 和 9.10.2.0 版本都已注册。尝试删除 9.0.2.7 版本失败,因为该版本的提供程序仍在 GAC 中引用程序集。
我进入注册表并手动删除了对 9.0.2.7 提供程序的所有引用。然后,我能够将其从 GAC 中删除。这并没有改变什么。从现有应用程序中删除程序集,然后重新添加 9.10.2.0 版本,然后编译,仍然会导致错误的程序集信息被插入到应用程序中。和以前一样,创建引用 9.10.2.0 程序集的新应用程序不起作用,因为对 9.0.2.7 的引用仍被插入到可执行文件中。
我检查了 Delphi 库搜索路径。我还完全从机器中删除了旧程序集文件的每个实例(包括从 ASP.NET 临时文件目录中)。我仍然有问题。我尝试使用 Issam Ali 的 AppManifest 实用程序手动调整清单,但显然它不支持 Delphi 2007 for .NET 中的 ASP.NET 应用程序。
因此,GAC 不再包含对 9.0.2.7 的引用,在注册表中没有对它的引用,在项目或 Delphi 选项对话框中没有到旧提供程序目录的路径,旧提供程序程序集不在文件系统上,并且 9.0.2.7 不会出现在任何项目文件中。它也不会出现在 web.config、machine.config 或我检查的任何其他文件中。尽管如此,每当我引用 9.10.2.0 版本的程序集时,Delphi 坚持使用此版本的程序集。(是的,我重新启动了 Delphi,还重新启动了正在执行此开发的虚拟机。)
即使在卸载 9.10.2.0 数据提供程序(旧的已卸载)并重新安装后,将数据提供程序引用添加到应用程序会导致运行时应用程序尝试加载旧提供程序(即使没有对旧提供程序的引用显然保留在系统中)。
我尝试了其他解决方案(这里值得一提),但没有一个奏效。有人看到这个吗?我将继续解决这个问题,但我很想听听建议。我只是无法让 Delphi 停止将旧的程序集信息插入到项目中。
为了咧嘴笑,我包括了失败的错误日志。该日志基本上复制了我从融合日志中获得的信息。此日志来自我在从 GAC 中删除 9.0.2.7 程序集后创建的一个简单应用程序。请注意,它从一开始就在寻找旧版本的提供程序。
从以下位置加载的程序集管理器:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 在可执行文件 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_wp.exe 下运行 --- 详细错误日志如下。
=== 预绑定状态信息 === LOG:User = TRAINING8A\ASPNET LOG:DisplayName = Advantage.Data.Provider,Version=9.0.2.7,Culture=neutral,PublicKeyToken=e33137c86a38dc06(完全指定) LOG:Appbase = file:///C:/Inetpub/wwwroot/TestAdsVer2/ LOG: Initial PrivatePath = C:\Inetpub\wwwroot\TestAdsVer2\bin
调用程序集:TestAdsVer2,Version=1.0.3572.17384,Culture=neutral,PublicKeyToken=null。
LOG:此绑定在默认加载上下文中开始。LOG:使用应用程序配置文件:C:\Inetpub\wwwroot\TestAdsVer2\web.config LOG:使用主机配置文件:c:\windows\microsoft.net\framework\v2.0.50727\aspnet.config LOG:使用机器配置文件来自 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config。日志:后策略参考:Advantage.Data.Provider,Version=9.0.2.7,Culture=neutral,PublicKeyToken=e33137c86a38dc06 日志:尝试下载新 URL 文件:///c:/WINDOWS/Microsoft.NET/Framework/v2 .0.50727/临时 ASP.NET 文件/testadsver2/07545aea/3d068a5/Advantage.Data.Provider.DLL。日志:尝试下载新 URL 文件:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/testadsver2/07545aea/3d068a5/Advantage.Data.Provider/Advantage.Data.Provider .DLL。日志:正在尝试下载新的 URL 文件:///C:/Inetpub/wwwroot/TestAdsVer2/bin/Advantage.Data.Provider.DLL。警告:比较程序集名称导致不匹配:次要版本错误:无法完成程序集设置(hr = 0x80131040)。探测终止
这已经持续了很长时间,以至于我添加到 LanceSC 答案中的评论不再显示。但我做的事情是我想解决的一个有趣的项目。
这是我对 LanceSC 的最后两条评论
出现此行为的安装位于不再运行的 VM 中。我认识的另一位开发人员遇到了同样的问题。解决方案是放弃安装。我觉得这个 .NET 数据提供程序的特定版本的安装程序中的某些东西留下了一些产生问题的奇怪工件。此数据提供程序的任何其他版本都不会发生这种情况。我不再追求这个问题的答案。
说得太早了。我的一位同事今天(2010 年 3 月 5 日)遇到了同样的错误,同样的 .NET 数据提供程序 (9.0.2.1) 的版本稍早一些。他现在处于和我一样的位置。他无法使用任何版本的数据提供者运行他的应用程序,只能保存旧版本。该程序集被用作本地副本,旧版本不在 gac 中。使用他的机器,我们运行带有详细选项的运行 MSBuild。构建工作正常,没有错误。尽管如此,编译应用程序未能运行,未能找到旧版本的提供程序。
概括
我的同事辞职重新安装了 Delphi 2007(幸运的是,他在 VM 中工作,并且有第二个使用 Delphi 2007 的 VM,其中从未安装过有问题的 .NET 数据提供程序。这也是我的策略。
在这一点上,我得出结论,这个问题是无法解决的。尽管如此,我将把这个问题留待一周左右。如果在接下来的几周内没有提出可行的解决方案,我将关闭这个问题。
同时,我已要求我的同事将 VM 与行为不端的提供商一起保存,以便测试提出的任何解决方案或调查。