【问题标题】:Azure shareclient works in one project and throws exception in anotherAzure shareclient 在一个项目中工作并在另一个项目中引发异常
【发布时间】:2021-12-05 15:17:48
【问题描述】:

我有一个 vb.net 解决方案,其中包含一个单独的项目,其中包含一个文件类来访问 Azure 文件和 2 个项目。在两者中,我都调用了包含此代码的文件类

Dim mascThis as ShareClient
... mascThis is initialized ...
If mascThis.Exists.Value then ... do something ..

在一个项目中这是可行的,在另一个项目中我得到了消息

无法加载文件或程序集“System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

我已经看到之前讨论过这个问题(组装问题),但所有项目都在同一个解决方案中,我通过 添加了 Azure.Storage.Files.Shares 12.8.0 Nuget 并且只有“文件类”项目有对它的引用,其他项目没有。

那么我在这里错过了什么?

【问题讨论】:

    标签: vb.net azure visual-studio azure-storage-files


    【解决方案1】:

    请检查以下是否属于您的情况。

    有时,我们会遇到解决方案的不同部分(项目)依赖于同一 DLL 的不同版本的情况,即;具有相同程序集名称的程序集。

    错误

    无法加载文件或程序集 'System.Runtime.CompilerServices.Unsafe,版本=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其之一 依赖关系。定位程序集的清单定义不 匹配程序集引用。 (HRESULT 异常:0x80131040)

    建议,您的项目正在寻找程序集版本 4.0.4.1

    解决方法

    我。通常 Nuget 包 4.5.3 包含程序集版本 4.0.4.1。 请检查您的解决方案中的两个项目是否可以在该程序集版本上工作,并通过binding redirect 将该特定版本作为新版本(例如:4.0.4.1)添加到您遇到错误的项目中。并保留旧版本代替旧版本。

    还可以右键单击包引用并在其属性下将“特定版本”设置为 false

    例子:

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
              <dependentAssembly>
                <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
              </dependentAssembly>
    

    在此示例中,这种添加方式指定运行时应在旧版本范围 0.0.0.0-4.0.6.0 之间的 Assembly 版本中使用版本 4.0.6.0

    否则,如果不是上述情况,则解决方案可能需要不同的版本。

    ii.

    1. 在项目属性中右击,选择ApplicationConfiguration文件和App.config

    2. 在 app.config 文件中添加以下设置。

    通过codeBases配置多个同名程序集。

    一些包的示例代码说“A”

    <configuration>
     <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="A " publicKeyToken="3d67ed1f87d44c89" />
            <codeBase version="3.0" href="...\A.dll"/>
            <codeBase version="5.0" href="...\A.dll"/>
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    三。看看你能不能用extern alias解决这个问题。

    四。如果您的应用程序或其组件引用同一程序集的多个版本,则会添加绑定重定向。请参阅Enable or disable autogenerated binding redirects | Microsoft Docs。如果您手动执行此操作,则需要在项目属性下禁用。 您可以手动在属性组的 csproj 文件中添加&lt;AutoGenerateBindingRedirects&gt;true&lt;/AutoGenerateBindingRedirects&gt;。 例如:

    <PropertyGroup>
       <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
    

    参考资料可能会有所帮助。

    【讨论】:

    • 感谢您对可能性的概述,这有助于系统地解决问题。
    • 感谢您对可能性的概述,这有助于系统地解决问题。 “绑定重定向”不起作用(即使我取消选中项目的“自动生成绑定重定向”。这可能是因为间接引用或某个 dll 中引用的某种形式的“硬”编码?使用“当我在 Visual Studio 中运行时,带有本地制作的版本 4.0.4.1 副本的代码库”工作,但在我创建了一个 .msi 之后,我确实将本地副本作为“程序集”添加到文件中并包含 app.config 文件. 这可能是什么原因?
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多