基于 Telerik 的 DLL 无法加载,由于增强器 (?) 问题

Telerik-based DLL does not load, due to enhancer(?) issues

提问人:Dominique 提问时间:10/18/2023 最后编辑:Dominique 更新时间:11/14/2023 访问量:242

问:

我正在开发一个 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.OpenAccessTelerik.OpenAccess.35.ExtensionsTelerik.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 警告:未找到持久类。是否缺少元数据信息?

  1. 什么是持久类(在 Telerik OpenAccess 术语中)?
  2. 提到的元数据是什么,在哪里以及如何读取/写入它?

编辑2:只是为了获得更多关注,因为赏金即将到期。

问题 2:当前问题

在我的公司中,通常从某种基类开始,这些基类的对象存储在 SQL 服务器数据库中。基类数据库中的最后一列是 ,显示上述对象的真实类。voa_class

现在我有一个基类和一个子类,在数据库中我有一个名为 的表,其中包含一个条目和另一个表,其中包含一个与表中的条目具有相同值的条目(两个字段相等允许两个条目相互链接)。Vehicles<Company>.Viastore.Server.Domain.ViastoreSrmVehiclesvoa_class<Company>.Viastore.Server.Domain.ViastoreSrmViastoreSrmidVehiclesid

在源代码中,我有以下一行:

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 上可以正常工作,因此我相信此增强器应该是开发环境之外的东西,但是什么?

有没有人可以阐明这件事?那个增强剂是什么?如何配置(或获取)它?...最重要的是:我怎样才能确保它不再阻碍我的发展?

提前非常感谢。

C# MSBuild 32 位-64 位 Telerik-Open-Access

评论

0赞 Dominique 10/18/2023
可能很有趣的事情:它经常发生,它起作用......一次!当我在 Visual Studio 2017、Visual Studio 2019、64 位、32 位等中尝试时,但是当我第二次尝试时,它不再起作用(即使在完成“清理”后也无法正常工作)。
0赞 Dominique 10/18/2023
...但有时“干净”确实有效,它非常不稳定。
1赞 Ralf 10/18/2023
增强器似乎是 Telerik 特有的东西。与所有关于付费组件的问题一样,它们也应该得到您付费的支持,所以我建议使用它。
1赞 D M 10/24/2023
注意:您的错误消息提到不存在,但您的下一行说不存在。这些不匹配。Local\Temp_ptil_15736\Local\Temp\_ptil_15736
1赞 D M 10/24/2023
部分,是的。调用异常中的最后一个文件夹,而语句中的最后一个文件夹调用 。语句的路径中有一个额外的文件夹。...\Local\...Temp_ptil_15736ptil_15736...\Temp\...
1赞 Dominique 10/24/2023
@DM:哎呀,你是对的。这似乎是由该网站的显示引起的。我已将目录名称转换为代码格式以更正显示。好渔获!

答:

-1赞 Ryan 11/9/2023 #1

问题 1:增强器问题

该错误消息表明增强器工具与程序集的 .NET 版本之间不兼容。以下是一些故障排除步骤:

  1. 确保您拥有的 Telerik 软件包中的增强器版本 引用与 .NET 4.0 兼容,因为您的项目是 以此版本为目标。

  2. 如果错误中提到的目录不存在,则可能是 在清理的生成过程中使用的临时目录 SPH公司

  3. 如果该路径不是持久的,则可以忽略该路径。

如果要处理 64 位程序集,可能需要在项目设置中将平台目标显式设置为 x64。

关于使用的 MSBuild 版本:

Visual Studio 通常使用与项目的平台目标和 .NET 版本一致的 MSBuild。但是,如果需要,可以在项目文件或生成脚本中指定所需 MSBuild 的路径。

问题 2:

持久类和增强器配置 Telerik OpenAccess 中的持久类是映射到数据库表的类。您看到的警告表明没有类被标记为持久性,或者元数据映射未被识别。

要解决此问题,请执行以下操作:

  1. 检查您的映射,确保它们已正确设置,并且 增强器工具可以识别它们。
  2. 验证连接字符串和配置设置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 和增强器工具时遇到的问题。

评论

3赞 Dalija Prasnikar 11/14/2023
这篇文章似乎全部或部分是使用 AI 工具创建的。请注意,生成式 AI(例如 ChatGPT)已被禁止,请阅读帮助中心:AI 政策。不允许使用 AI 工具生成或改写您在 Stack Overflow 上发布的内容,即使您事先审查了这些内容。他人的作品不注明出处也构成剽窃。读者应该仔细和批判性地审查这个答案,因为人工智能生成的信息通常包含根本性的错误和错误信息。
0赞 Ryan 11/17/2023
当 AI 失败并错误地识别 AI 时。这是 AI 的 AI 矩阵。
1赞 Dalija Prasnikar 11/17/2023
该帖子的识别没有涉及人工智能。只有人脑。