在 Acumatica 21R1 中从 Visual studio 编译自定义项目后出现错误

Getting error after compiling custom project from Visual studio in Acumatica 21R1

无法加载文件或程序集 'Microsoft.Bcl.AsyncInterfaces' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040) 说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的详细信息。

异常详细信息:System.IO.FileLoadException:无法加载文件或程序集 'Microsoft.Bcl.AsyncInterfaces' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

我必须保留 dll 的备份副本并再次替换它以使站点出现。如何解决问题

编辑: 错误的根本原因可能是您在 Acumatica DLL 扩展项目中引用了 Microsoft DLL。

并且您也可能在添加扩展投影参考的同一解决方案中有一个网站。要检查这一点,请右键单击网站转到 属性 页面并检查参考,在项目参考部分中使用添加参考按钮。

此设置会在您编译时自动复制引用。您可以使用 CopyLocal=False 属性 删除某些引用的复制。然而,这似乎不适用于 Microsoft.Bcl.AsynInterfaces。也许您使用了 Acumatica 自定义页面中的 Bind 功能来 set-up 从 Acumatica 自定义页面自动复制或创建扩展 C# 项目。


以防网站被 Acumatica Bin 目录中的 DLL 文件破坏。要恢复原始 DLL 文件,请使用 Acumatica ERP 向导(与损坏网站相同的版本)和 select 'Perform Application Maintenance'

然后 select 损坏的站点和 运行 'Update Only Website':

检查之前损坏的 DLL 的日期:

然后找出将 Acumatica 附带的原始 DLL 文件替换为不兼容版本的进程并将其删除。我怀疑您正在 Visual Studio 中编译 C# 项目。该项目配置为将文件直接部署到 Acumatica Bin 目录中。编译后损坏的 DLL 文件的日期将在 Acumatica Bin 文件夹中更改。

尝试从您的解决方案中删除该网站(如果它存在并且引用了您的 C# Acumatica 扩展项目):

如果有 Post 构建脚本(项目属性-> 构建)替换 Acumatica DLL,请将其删除。

然后编译到 Acumatica Bin 文件夹以外的任何目录。这是在 C# 项目属性构建部分中配置的。

编译完成后,仅将不包含 'Microsoft.Bcl.AsyncInterfaces.dll' 的所需编译文件复制到 Acumatica Bin 文件夹。

此复制操作可以手动完成,使用批处理文件,使用 post 构建脚本等...重要的是它不应该复制 Acumatica 已经附带的 DLL 文件。

另一种可能的解决方案是 select 与 Acumatica 站点在您自己的扩展 DLL 中使用的相同 .Net Framework 版本。这样在编译时您将用相同版本替换 Microsoft DLL。

我通过在我的 DLL 项目中引用 Microsoft.Bcl.AsyncInterfaces DLL 解决了这个问题。我做的DLL工程设置为直接把DLL放到Acumatica网站的bin目录下。当我将 Acumatica 网站包含在 Visual Studio 项目中时,这会起作用。 .Net 4.8,Acumatica 2021 R2,Visual Studio 2019

安抚 Acumatica 的 Microsoft.Bcl.AsyncInterfaces.dll 位于 C:\Program Files\Acumatica ERP\Files\Bin 文件夹中。

我注意到构建 21.106.0024 的 web.config(在 Acumatica ERP 2021 R1 21.106 下。0024\Acumatica ERP\Files)显示以下内容:

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
  </dependentAssembly>

但相同构建版本的 Acumatica 安装实例显示:

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
  </dependentAssembly>

所以我把1.0版本注释掉,放入5.0版本就成功了:

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
    <!--<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />-->
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
  </dependentAssembly>

该解决方法适用于本地开发,没有问题,但我认为安装程序存在错误。奇怪的是 web.config 从安装的文件看起来是正确的,但在创建新实例时却不是。