提问人:Dominique 提问时间:10/18/2023 最后编辑:Dominique 更新时间:11/14/2023 访问量:242
基于 Telerik 的 DLL 无法加载,由于增强器 (?) 问题
Telerik-based DLL does not load, due to enhancer(?) issues
问:
我正在开发一个 C# 解决方案,其中包含两个项目,一个客户端和一个服务器。
两者通常都是使用“任何 CPU”(在我看来这意味着)构建的,它们是作为 64 位进程构建的。
我面临着不同的问题,很可能是由于一些增强器问题,但我不知道这可能是什么。
我已经为第一个问题提供了 200 分的赏金,但我没有得到任何回应。由于我现在有第二个问题,而不是创建第二个 StackOverflow 帖子并等待两天开始另一个赏金,我将第二个问题添加到这个问题中并立即开始赏金。
问题 1:较旧的问题
在构建客户端时,现在我收到以下错误消息:
无法加载指定的程序集。问题可能是增强器在 .NET Framework 2.0 VM 中运行,并且要增强的程序集是 .NET 4.0 程序集,或者您正在尝试增强 64 位进程中的 x86 程序集或 32 位进程中的 x64 程序集。请在增强程序 .exe.config 或 venhance.exe.config 中更改所需的版本,或为此项目切换到“任何 CPU”。
'C:\Users\DDM\AppData\Local\Temp\_ptil_15736\Client_Program.Client.dll'
现在,一些努力:
- 提到的目录甚至不存在。
C:\Users\DDM\AppData\Local\Temp\_ptil_15736
- 将构建平台从“任何 CPU”更改为“x86”有时会使客户端工作,有时则不会。
在互联网上,我找到了以下 URL,解释了有关 32 位和 64 位的一些内容以及有关增强器的一些事情,无论它可能是什么。
额外的努力:
在我的服务器应用程序和客户端应用程序中,我都对 Telerik DLL 进行了相当多的引用。大多数都有版本“v4....“,但 and and 版本为”v2.0.50727”。Telerik.OpenAccess
Telerik.OpenAccess.35.Extensions
Telerik.OpenAccess.Runtime
就增强器而言,这是我找到它们的地方:
C:\<all_projects>\packages\Telerik.DataAccess.Fluent.2013.3.1320.1\tools\enhancer\enhancer.exe.config
C:\<all_projects>\packages\Telerik.DataAccess.Fluent.2013.3.1320.1\tools\enhancer\venhance.exe.config
C:\<all_projects>\packages\Telerik.DataAccess.Fluent.2016.2.822.1\tools\enhancer\enhancer.exe.config
C:\<all_projects>\packages\Telerik.DataAccess.Fluent.2016.2.822.1\tools\enhancer\venhance.exe.config
(我不知道其中哪些是实际使用的。
所有这些“*增强*.exe.config”文件都具有相同的内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<!--The enhancer is compiled against .NET 4.0.-->
<!--To be able to enhance an .NET 2.0 assembly please comment out the next line:-->
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
进一步查看上述 URL,有以下引述:
Visual Studio 将 MsBuild.exe 作为 32 位进程启动
好吧,我看了一下计算机上不同的“MSBuild.exe”文件,这就是我想出的:
C:\>dir /S /B "msbuild.exe"
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\amd64\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\amd64\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\amd64\MSBuild.exe
C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe
C:\Program Files (x86)\MSBuild\12.0\Bin\amd64\MSBuild.exe
C:\Temp_Folder\Default\MSBuild.exe
C:\Temp_Folder\NativeImage\MSBuild.exe
C:\Windows\assembly\GAC_32\MSBuild\3.5.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\assembly\GAC_64\MSBuild\3.5.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_12.0.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\assembly\GAC_32\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\assembly\GAC_64\MSBuild\v4.0_12.0.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\assembly\GAC_64\MSBuild\v4.0_4.0.0.0__b03f5f7f11d50a3a\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_10.0.19041.1_none_fa6e7f402dbc0227\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_3.5.19041.1_none_82a6b3679b68b331\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_4.0.15805.0_none_dc3886319c616739\MSBuild.exe
C:\Windows\WinSxS\amd64_msbuild_b03f5f7f11d50a3a_4.0.15840.3_none_dc3389e19c65e13f\MSBuild.exe
C:\Windows\WinSxS\wow64_msbuild_b03f5f7f11d50a3a_4.0.15805.0_none_0606cd4b5dabfc56\MSBuild.exe
C:\Windows\WinSxS\wow64_msbuild_b03f5f7f11d50a3a_4.0.15840.3_none_0601d0fb5db0765c\MSBuild.exe
C:\Windows\WinSxS\x86_msbuild_b03f5f7f11d50a3a_10.0.19041.1_none_421bb61742382b2d\MSBuild.exe
C:\Windows\WinSxS\x86_msbuild_b03f5f7f11d50a3a_3.5.19041.1_none_268817e3e30b41fb\MSBuild.exe
如何知道使用了哪一个,以及如何将其替换为 64 位 MSBuild.exe?
编辑:
在构建我的应用程序时,我看到以下警告,有人知道这意味着什么吗?
MSBUILD:OpenAccess Enhancer 警告:未找到持久类。是否缺少元数据信息?
- 什么是持久类(在 Telerik OpenAccess 术语中)?
- 提到的元数据是什么,在哪里以及如何读取/写入它?
编辑2:只是为了获得更多关注,因为赏金即将到期。
问题 2:当前问题
在我的公司中,通常从某种基类开始,这些基类的对象存储在 SQL 服务器数据库中。基类数据库中的最后一列是 ,显示上述对象的真实类。voa_class
现在我有一个基类和一个子类,在数据库中我有一个名为 的表,其中包含一个条目和另一个表,其中包含一个与表中的条目具有相同值的条目(两个字段相等允许两个条目相互链接)。Vehicles
<Company>.Viastore.Server.Domain.ViastoreSrm
Vehicles
voa_class
<Company>.Viastore.Server.Domain.ViastoreSrm
ViastoreSrm
id
Vehicles
id
在源代码中,我有以下一行:
namespace <Product>.<Customer>.Server
{
ViastoreSrm viastore = database.GetData<ViastoreSrm>().FirstOrDefault();
虽然这是标准的(这种从 Telerik Openaccess 数据库获取数据的方式已经使用了十多年),但现在我得到了以下内容:Exception
System.ArgumentOutOfRangeException: Type is enhanced and registered, but not available from the database class meta data. This can be caused by a wrong connection id or configuration.
Parameter name: type
Actual value was <Product>.Viastore.Server.Domain.ViastoreSrm.
at OpenAccessRuntime.ObjectScope.GetMetaData(Type type)
at OpenAccessRuntime.ObjectScope.CheckPersistentType(Type type)
at Telerik.OpenAccess.ExtensionMethods.Extent[T](IObjectScope scope)
at Telerik.OpenAccess.OpenAccessContext.GetAllCore[T]()
at Telerik.OpenAccess.OpenAccessContext.GetAll[T]()
at <Product>.Server.OpenAccess.Database.GetData[T]()
at <Product>.<Customer>.Agv.Server.Manager.CheckViastoreOrder(IDatabaseConnection database) in C:\...\<Customer>\<Product>.<Customer>.Agv.Server\Manager.Viastore.cs:line 53
如您所见,该消息正在谈论连接 ID(什么连接 ID?)、配置(配置的哪一部分?)......但最重要的是,增强器又回到了画面中!Exception
我的印象是,该增强器是导致我的应用程序的许多不良行为的原因。由于此代码在同事的 PC 上可以正常工作,因此我相信此增强器应该是开发环境之外的东西,但是什么?
有没有人可以阐明这件事?那个增强剂是什么?如何配置(或获取)它?...最重要的是:我怎样才能确保它不再阻碍我的发展?
提前非常感谢。
答:
问题 1:增强器问题
该错误消息表明增强器工具与程序集的 .NET 版本之间不兼容。以下是一些故障排除步骤:
确保您拥有的 Telerik 软件包中的增强器版本 引用与 .NET 4.0 兼容,因为您的项目是 以此版本为目标。
如果错误中提到的目录不存在,则可能是 在清理的生成过程中使用的临时目录 SPH公司
如果该路径不是持久的,则可以忽略该路径。
如果要处理 64 位程序集,可能需要在项目设置中将平台目标显式设置为 x64。
关于使用的 MSBuild 版本:
Visual Studio 通常使用与项目的平台目标和 .NET 版本一致的 MSBuild。但是,如果需要,可以在项目文件或生成脚本中指定所需 MSBuild 的路径。
问题 2:
持久类和增强器配置 Telerik OpenAccess 中的持久类是映射到数据库表的类。您看到的警告表明没有类被标记为持久性,或者元数据映射未被识别。
要解决此问题,请执行以下操作:
- 检查您的映射,确保它们已正确设置,并且 增强器工具可以识别它们。
- 验证连接字符串和配置设置Validate the connection string and configuration settings in your 'app.config' 或 'web.config' 以确保它们指向 正确的数据库。
System.ArgumentOutOfRangeException 异常:
如果代码中定义的类与数据库中可用的元数据不匹配,则可能会发生此异常。
要解决此问题,请执行以下操作:
验证数据库架构是否与代码中的类保持同步。 确保“车辆”表格中的“voa_class”列正确反映了类层次结构和所有子类条目。
关于增强器工具:
增强器是一种生成后工具,用于修改已编译的 .NET 程序集以插入持久性代码。它不是外部工具,而是 Telerik 数据访问流程的一部分。如果您使用 Telerik 的 ORM,则无法摆脱它,但您可以通过“增强器.exe.config”或“venhance.exe.config”文件对其进行配置。
其他建议:
将同事的电脑的工作环境与你的电脑进行比较,以确定任何配置差异。 查看 Telerik 文档,了解将增强器与 .NET 4.0 程序集一起使用所需的任何其他步骤。 请考虑联系 Telerik 支持或其社区论坛,以获取有关增强器工具及其配置的具体建议。 我希望这有助于解决您在使用基于 Telerik 的 DLL 和增强器工具时遇到的问题。
评论
Local\Temp_ptil_15736
\Local\Temp\_ptil_15736
...\Local\...
Temp_ptil_15736
ptil_15736
...\Temp\...