代码之家  ›  专栏  ›  技术社区  ›  Cary Jensen

ASP。NET与Delphi 2007一起使用。网无法加载文件或程序集找到的程序集的清单定义与程序集引用不匹配

  •  3
  • Cary Jensen  · 技术社区  · 16 年前

    这一个让人挠头。这就是交易。

    在部署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的最后两条评论

    1. 出现这种行为的安装在一个不再运行的VM中。我认识的另一位开发者也遇到了同样的问题。解决办法是放弃安装。我觉得这个特定版本的安装程序中有些东西。NET数据提供者留下了一些奇怪的工件,导致了这个问题。此数据提供程序的任何其他版本都不会出现这种情况。我不再寻求这个问题的答案。

    2. 我说得太快了。我的一位同事今天(2010年3月5日)遇到了同样的错误,其版本稍早。NET数据提供程序(9.0.2.1)。他现在的处境和我一样。他无法使用任何版本的数据提供程序运行应用程序,请保存旧版本。该程序集被用作本地副本,旧版本不在gac中。使用他的机器,我们使用verbose选项运行了run-MSBuild。构建工作正常,没有错误。尽管如此,由于找不到提供程序的旧版本,编译应用程序未能运行。

    总结

    我的同事听天由命地重新安装了Delphi 2007(幸运的是,他在一个虚拟机中工作,并且在Delphi 2007中有第二个虚拟机,其中没有安装令人不快的.NET数据提供程序。这也是我的策略。

    在这一点上,我得出结论,这个问题是无法解决的。尽管如此,我还是将这个问题留待一周左右的时间讨论。如果在未来几周内没有提出可行的解决方案,我将结束这个问题。

    同时,我已要求我的同事与行为不端的提供商一起保存VM,以便测试提出的任何解决方案或调查。

    3 回复  |  直到 15 年前
        1
  •  3
  •   LanceSc    16 年前

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

    打开注册表编辑器转到

    HKEY_LOCAL_MACHINE\SOFTWARE\Borland\BDS\5.0\Globals

    将ForceEnvOptions Update的值更改为1。

    打开RAD Studio IDE。

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

        2
  •  1
  •   Jeremy Mullin    16 年前

    你试过grep'ing the Delphi and吗。NET framework 9.0.2.7的目录,以查看它是否在某个配置文件中?

    比如:

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

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

    • 在项目文件中搜索9.0.2.7
    • 注册表搜索9.0.2.7,并使用公共令牌进行搜索
    • 如果此应用程序使用BDP,您还可以搜索BDP配置文件
        3
  •  0
  •   Ritchie annand    15 年前

    我遇到了非常像这样的事情,这让我好几天都无法自拔。我提到了甲骨文。数据访问。dll,无论GAC、搜索路径等中有什么内容,它都坚决指向旧版本。没有对该版本进行任何重新启动的修改。dproj文件永远都不会起作用。

    我最终发现,保留旧引用的令人不快的部分是生成的甲骨文。数据访问。dcpil位于C:\Users\Public\documents\rad studio\5.0\dcp目录中。

    是的 一岁多 -不管是什么情况,德尔福都不想把它写下来。

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

    啊,令人沮丧!

    推荐文章