【发布时间】:2009-10-12 17:58:36
【问题描述】:
这是一个令人头疼的问题。这是交易。
在将使用 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 下运行 --- 详细的错误日志如下。
=== 预绑定状态信息 === 日志:用户 = TRAINING8A\ASPNET 日志:DisplayName = Advantage.Data.Provider,Version=9.0.2.7,Culture=neutral,PublicKeyToken=e33137c86a38dc06 (完全指定) 日志:Appbase = file:///C:/Inetpub/wwwroot/TestAdsVer2/ 日志:初始 PrivatePath = C:\Inetpub\wwwroot\TestAdsVer2\bin
调用程序集:TestAdsVer2,Version=1.0.3572.17384,Culture=neutral,PublicKeyToken=null。
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/Temporary ASP.NET Files/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。 警告:比较程序集名称导致不匹配:次要版本 ERR:无法完成程序集的设置(hr = 0x80131040)。探测终止
这种情况持续了很长时间,以至于我添加到 LanceSC 答案中的 cmets 不再显示。但我做的事情是,这是我想要解决的一个有趣的问题。
这是我在 LanceSC 的最后两次比赛
出现此行为的安装位于不再运行的 VM 中。我认识的另一位开发人员遇到了同样的问题。解决方案是放弃安装。我觉得这个 .NET 数据提供程序的特定版本的安装程序中的某些东西留下了一些产生问题的奇怪工件。此数据提供程序的任何其他版本都不会发生这种情况。我不再寻求这个问题的答案。
说得太早了。我的一位同事今天(2010 年 3 月 5 日)遇到了同样的错误,同样的 .NET 数据提供程序 (9.0.2.1) 的版本稍早一些。他现在处于和我一样的位置。他无法使用任何版本的数据提供者运行他的应用程序,只能保存旧版本。该程序集被用作本地副本,旧版本不在 gac 中。使用他的机器,我们运行带有详细选项的运行 MSBuild。构建工作正常,没有错误。尽管如此,编译应用程序还是无法运行,因为找不到旧版本的提供程序。
总结
我的同事决定重新安装 Delphi 2007(幸运的是,他正在使用虚拟机,并且有第二台使用 Delphi 2007 的虚拟机,其中从未安装过有问题的 .NET 数据提供程序。这也是我的策略。
至此,我已经得出结论,这个问题是无法解决的。尽管如此,我还是把这个问题留了一周左右。如果在接下来的几周内没有提出可行的解决方案,我将关闭此问题。
与此同时,我已要求我的同事保留行为不端的提供商的虚拟机,以便测试提出的任何解决方案或调查。
【问题讨论】:
-
这是另一个难题,但无论如何都不是决定性的。我创建了操作系统和 RAD Studio 2007 的全新安装。我安装了数据提供程序的 9.10.2.0 版本(从未安装过 9.0.2.7 版本)。然后我从源代码管理中检索了整个项目。此版本运行良好,并且不需要 9.0.2.7 版本的提供程序。换句话说,对旧提供程序的请求似乎并没有以某种方式嵌入到项目源文件中。
标签: asp.net delphi gac delphi-2007 advantage-database-server