ASP.NET 与用于 .NET 的 Delphi 2007。无法加载文件或程序集...定位的程序集的清单定义与程序集引用不匹配

Posted

技术标签:

【中文标题】ASP.NET 与用于 .NET 的 Delphi 2007。无法加载文件或程序集...定位的程序集的清单定义与程序集引用不匹配【英文标题】:ASP.NET with Delphi 2007 for .NET. Could not load file or assembly … The located assembly's manifest definition does not match the assembly reference 【发布时间】: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 版本的提供程序。换句话说,对旧提供程序的请求似乎并没有以某种方式嵌入到项目源文件中。 【参考方案1】:

Delphi 2007 使用 MSBuild 来执行实际的构建;但是,他们产品中用于在 IDE 和 MSBuild 之间同步更改的代码非常脆弱。我怀疑构建文件与 IDE 不同步。更新它们的简单方法如下:

打开你的注册表编辑器去

HKEY_LOCAL_MACHINE\SOFTWARE\Borland\BDS\5.0\Globals

将 ForceEnvOptionsUpdate 的值更改为 1。

打开 RAD Studio IDE。

为了证实我的怀疑,您需要找到 Delphi.NET 提供给 MSBuild 的文件。它们位于当前用户配置文件下的某个位置。您可能还想查看 Delphi 帮助中的选项,以使其执行详细的 MSBuild 输出。

【讨论】:

感谢您的建议。我会看看并报告我的发现。 我查看了注册表,发现没有 ForceEnvOptionsUpdate 键。我用 1 个字符串值添加了这个键(2007 readme.txt 提到这是一个字符串值)。这仍然没有效果。我假设 MSBuild 使用 dproj 文件。我没有看到任何应该产生影响的参考。我还搜索了 .NET 框架目录、项目目录和 RAD Studio 5.0 目录以及 9.0.2.7 的文档和设置目录中的所有文件,但没有成功。我在此搜索中包含了隐藏文件和系统文件。还在挠头。 到那时,我在整个硬盘上搜索了 9.0.2.7。搜索找到了一些匹配项。这些都与缓存的错误消息或融合日志相关联(就像我在原始问题中显示的那样),以及我在删除 9.0.2.7 提供程序的所有挥之不去的残留物之前所做的注册表备份。跨度> 看起来您需要尝试调试在后台发生的 MSBuild 任务。执行此操作的最简单方法是打开 RAD Studio 命令提示符,导航到包含项目的文件夹并执行以下命令 msbuild /verboisty:diagnostic > log.out 然后您需要查看 log.out 以查看它的位置来自的程序集。 感谢您的建议。我现在正忙于一个不同的项目,一旦我上空就会这样做。顺便说一句,我可以将所有项目文件复制到另一个从未安装过 9.0.2.7 文件的 VM,并且一切正常。因此,这似乎不是项目文件中的问题。【参考方案2】:

您是否尝试过对 9.0.2.7 的 Delphi 和 .NET 框架目录进行 grep 处理以查看它是否在某个配置文件中?

类似:

grep -d 9\.0\.2\.7 *.xml

您可能会搜索的其他地方:

在项目文件中搜索 9.0.2.7 注册表搜索 9.0.2.7,并使用公共令牌进行搜索 如果此应用使用 BDP,您还可以搜索 BDP 配置文件

【讨论】:

我已经搜索了所有我能想到的东西。在任何地方都找不到 9.0.2.7(至少,不再)。 您查看过 project.dproj 文件吗?我为 .net asp.net 应用程序创建了一个 delphi,并在我的 project.dproj 文件中找到了引用的程序集信息。 是的,我做到了。那里唯一的引用指向 9.10.2.0 版本的程序集所在的目录。 (9.0.2.7 版本的程序集在安装时出现在与 9.10.2.0 版本不同的文件夹中。)【参考方案3】:

我遇到了非常类似的事情,这让我好几天都陷入了困境。我有一个对 Oracle.DataAccess.dll 的引用,它坚决地指向旧版本,无论 GAC 中、搜索路径中的内容是什么,等等。对 .dproj 文件的修改再重新启动都不会起作用。

我最终发现,保留旧参考的有问题的是 C:\Users\Public\documents\rad studio\5.0\dcp 目录中生成的 Oracle.DataAccess.dcpil。

它已经一年多了 - 不管是什么情况,Delphi 都不想重写它。

一旦我删除它,Delphi 就愉快地创建了另一个,果然,它现在指向我想要它的程序集。

啊,令人沮丧!

【讨论】:

嗯。这是一个有趣的建议。我很确定我删除了几乎所有我不需要的东西,而且我很确定我删除了所有 dcpil 文件,甚至是公共文件夹中的文件。我已经一年多没有看过这个虚拟机了,而且除了 Advantage .NET Data Provider 的一个特定版本之外,我还没有看到过这个问题。我假设问题是由于该特定版本的驱动程序出现异常所致。 很可能是这样。实际上,在试图找出我自己的问题的过程中,我很早就在这里看到了你的帖子。效果非常相似:无论我做什么,它都想要一个旧版本的库。我记得当时在想,“天啊——如果 Cary Jensen 不能解决这类问题,我就完蛋了”。无论如何,希望如果有人被 Dcp 目录中的错误文件搞砸了,他们会使用我在这里找到的相同搜索词找到这个:)

以上是关于ASP.NET 与用于 .NET 的 Delphi 2007。无法加载文件或程序集...定位的程序集的清单定义与程序集引用不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE7下 Intraweb 发布为ASP.NET应用程序

文字控件用于啥,与 asp.net 中的标签控件有啥区别?

Grid++Report

如何打印与 phpinfo() 类似的信息,但用于 ASP.NET?

Asp.net - 用于存储字典的缓存与静态变量

将 jQuery 用于 AJAX 与 ASP.NET Webforms [关闭]