这一个让人挠头。这就是交易。
在部署ASP的测试版时。NET应用程序,使用Delphi 2007构建。NET连接到测试服务器时,我遇到了一个奇怪的问题。应用程序无法启动,因为它无法加载正确版本的ADO。我正在使用的NET数据提供程序。
只有在bin目录中包含旧程序集的版本,应用程序才能运行。然而,我不想被束缚在这个古老的世界里。NET数据提供商,所以我决心找到解决这个问题的方法。
我最初是用。net数据提供程序集用作本地副本,这应该会导致Delphi使用我在将其添加到项目管理器的References文件夹时选择的程序集版本的副本。我选择的实际程序集是版本9.10.2.0,这是与应用程序一起出现在bin目录中的程序集的版本。然而,在运行时,应用程序试图绑定到同一程序集的早期版本9.0.2.7。
(实际上,无论我是否使用GAC版本的Copy Local,这个问题都会发生,所以我认为这不是问题所在。)
在研究这个问题时,我创建了一个新项目,并添加了对9.10.2.0程序集的引用。尽管如此,两种方法都是有效的。NET 2.0配置实用程序和Reflector显示,该应用程序是参考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的引用仍在插入可执行文件中。
我查了德尔福图书馆的搜索路径。我还从机器中删除了所有旧程序集文件的实例(包括ASP.NET临时文件目录)。我还是有问题。我尝试使用Issam Alis AppManifest实用程序手动调整清单,但显然它不支持ASP。NET在Delphi 2007中的应用程序。网
因此,GAC不再包含对9.0.2.7的引用,在注册表中没有对它的引用,在项目或Delphi选项对话框中没有指向旧提供程序目录的路径,旧提供程序程序集不在文件系统中,并且9.0.2.7不出现在任何项目文件中。它也没有出现在网络上。配置,机器。配置,或者我查过的任何其他文件。尽管如此,只要我引用9.10.2.0版本的程序集,Delphi就坚持使用这个版本的程序集。(是的,我重新启动了Delphi,还重新启动了执行此开发的虚拟机。)
即使在卸载9.10.2.0数据提供程序(旧的已卸载)并重新安装后,向应用程序添加数据提供程序引用也会导致运行时应用程序尝试加载旧的提供程序(尽管系统中显然没有保留对旧提供程序的引用)。
我尝试过其他解决方案(这里值得一提),但没有一个奏效。有人看到了吗?我将继续研究这个问题,但我很乐意听取建议。我只是无法让Delphi停止在项目中插入旧的装配信息。
对于grins,Im包括故障的错误日志。这个日志基本上复制了我从fusion日志中获得的信息。此日志来自我从GAC中删除9.0.2.7程序集后创建的一个简单应用程序。请注意,它从一开始就在寻找提供者的旧版本。
从c:\WINDOWS\Microsoft加载的程序集管理器。NET\Framework\v2。0.50727\mscorwks。动态链接库
在可执行文件c:\windows\microsoft下运行。net\framework\v2。0.50727\aspnet\u wp。exe
---下面是详细的错误日志。
==预绑定状态信息===
日志:User=TRAINING8A\ASPNET
LOG:DisplayName=Advantage。数据提供者,版本=9.0.2.7,区域性=中性,PublicKeyToken=e33137c86a38dc06
(详细说明)
日志:Appbase=file:///C:/Inetpub/wwwroot/TestAdsVer2/
日志:Initial PrivatePath=C:\Inetpub\wwwroot\TestAdsVer2\bin
调用程序集:TestAddVer2,版本=1.0.3572.17384,区域性=neutral,PublicKeyToken=null。
日志:此绑定在默认加载上下文中启动。
日志:使用应用程序配置文件:C:\Inetpub\wwwroot\TestAdsVer2\web。配置
日志:使用主机配置文件:c:\windows\microsoft。net\framework\v2。0.50727\aspnet。配置
日志:使用c:\WINDOWS\Microsoft中的计算机配置文件。NET\Framework\v2。0.50727\config\machine。配置。
日志:发布策略参考:优点。数据提供者,版本=9.0.2.7,区域性=中性,PublicKeyToken=e33137c86a38dc06
日志:正在尝试下载新的URLfile:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/TemporaryASP。NET文件/testadsver2/07545aea/3d068a5/Advantage。数据供应商。DLL。
日志:正在尝试下载新的URLfile:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/TemporaryASP。NET文件/testadsver2/07545aea/3d068a5/Advantage。数据供应商/优势。数据供应商。DLL。
日志:正在尝试下载新的URLfile:///C:/Inetpub/wwwroot/TestAdsVer2/bin/Advantage.Data.Provider.DLL.
警告:比较程序集名称导致不匹配:次要版本
错误:未能完成组件的设置(hr=0x8013100)。探测终止
这种情况持续了很长时间,以至于我在LanceSC的回答中添加的评论不再显示出来。但我想说的是,这是一个有趣的问题。
以下是我对LanceSC的最后两条评论
-
出现这种行为的安装在一个不再运行的VM中。我认识的另一位开发者也遇到了同样的问题。解决办法是放弃安装。我觉得这个特定版本的安装程序中有些东西。NET数据提供者留下了一些奇怪的工件,导致了这个问题。此数据提供程序的任何其他版本都不会出现这种情况。我不再寻求这个问题的答案。
-
我说得太快了。我的一位同事今天(2010年3月5日)遇到了同样的错误,其版本稍早。NET数据提供程序(9.0.2.1)。他现在的处境和我一样。他无法使用任何版本的数据提供程序运行应用程序,请保存旧版本。该程序集被用作本地副本,旧版本不在gac中。使用他的机器,我们使用verbose选项运行了run-MSBuild。构建工作正常,没有错误。尽管如此,由于找不到提供程序的旧版本,编译应用程序未能运行。
总结
我的同事听天由命地重新安装了Delphi 2007(幸运的是,他在一个虚拟机中工作,并且在Delphi 2007中有第二个虚拟机,其中没有安装令人不快的.NET数据提供程序。这也是我的策略。
在这一点上,我得出结论,这个问题是无法解决的。尽管如此,我还是将这个问题留待一周左右的时间讨论。如果在未来几周内没有提出可行的解决方案,我将结束这个问题。
同时,我已要求我的同事与行为不端的提供商一起保存VM,以便测试提出的任何解决方案或调查。