更新旧的 C#

Updating an old C#

所以我是一个相当新的开发人员,希望有人可以向我解释一些事情并帮助我理解如何完成我的任务。

好的,我们的一项服务有一个“Web 应用程序”,它是很久以前用 C# 编写的。它引起了我的雇主的注意,他要求我将它更新到最新的 framework/add 或删除软件包并重新构建它(它现在没有构建)。

所以当我添加包时,问题就来了。我尝试了复制手动丢失的 DLL 文件的旧方法,因为 VPC 不允许使用“NuGet”。我尝试在家里用 NuGet 做这个,但还是失败了。

大多数情况下我会收到以下类型的错误:

Could not load file or assembly 'DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken="CustomNumber"' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040).

注意:CustomNumber 代表public key token 我刚才没复制。

一个用于 DocumentFormat.OpenXml,另一个用于 Ajax.min 控制工具包。

任何人都可以给我任何关于如何更新旧项目或者如何解决它们的指示或解释吗? 有没有关于如何解决此类问题的特定方法或方法,或者它只是基本的谷歌搜索,直到你燃烧为止? (我试过谷歌搜索但还是卡住了)

您是否添加了对 WindowsBase 的引用?

VS 2019 / VS 2017:

在 VS 菜单中,

  • 单击项目
  • Select 添加引用...
  • 单击 程序集
  • 检查Windows基础
  • 点击确定

另见:How to include the reference of DocumentFormat.OpenXml.dll on Mono2.10?

如果您正在寻找最新版本,您需要查看:

What's new in .NET 5

What is .NET Framework

Download .NET, .NET Core, and .NET Framework

Github: Open-XML-SDK

NuGet: DocumentFormat.OpenXml

既然你说你是一个“相当新的开发者”,下面是一些可能对你有用的信息。

ildasm

如果您有兴趣查看 .NET DLL 文件或 .NET .exe 文件中使用了哪些程序集,您可以使用 Windows 工具包中的 ildasm.exe

注意:SDK 可以在 %ProgramFiles(x86)%\Microsoft SDKs\Windows\ 中找到(例如:C:\Program Files (x86)\Microsoft SDKs\Windows)

ildasm.exe 可以在以下一个或多个位置找到(假设 SDK 安装在默认位置):

赢 10:

  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 工具
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 工具
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 工具
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\x64 ...

Win 8.1:

  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 工具
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64

Win 7:

  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 工具
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\x64
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\
  • `%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\x64

运行 ildasm.exe

  • 双击 ildasm.exe 到 运行 它(或打开 cmd window 并输入 ildasm.exe
  • 单击文件
  • Select 打开
  • 选择您的 DLL 文件或 .exe 文件(例如:TestDLL35.dll)
  • 双击MANIFEST在新的window
  • 中打开

您会看到如下内容:

...

当您看到:.assembly extern <name>(例如:.assembly extern System.Core)时,这指定了所需的程序集。查看大括号内的 .ver 以查看正在使用的程序集的版本。对于 .NET 程序集,这是该库的 .NET 版本(例如:3:5:0:0),表明使用了 .NET 3.5。

如果查看 .assembly DocumentFormat.OpenXml 的“.ver”,版本显示为 2:0:5022:0,即版本 2.0.5022.0.


NuGet 包

这里有一些关于 NuGet 包的信息,如果你安装了一个(在家里)。如果安装了 NuGet 包,可以在 %UserProfile%\.nuget\packages 中找到它。例如,最新的 NuGet 包 DocumentFormat.OpenXml,可以在 C:\Users\<username>\.nuget\packages\open-xml-sdk\<version>\lib\<.NET version> 中找到(例如:C:\Users\TestUser\.nuget\packages\open-xml-sdk.9.1\lib\net46)。 OpenXml 版本 2.0,可以在 NuGet 包中找到 DocumentFormat.OpenXmlSDK (C:\Users\\.nuget\packages\documentformat.openxmlsdk.0.0\lib\Net35)

在 Visual Studio 中,以下设置决定是否将 .NuGet 包复制到您的本地项目文件夹:

在 VS 菜单中:

  • 单击工具
  • Select 选项
  • 展开 NuGet 包管理器
  • 单击常规
  • 在包管理下,查看默认包管理格式的值。

注意:当指定Packages.config,并且项目中安装了.NuGet包时,它将下载到 %UserProfile%\.nuget\packages\<NuGet package name>,然后复制到您的解决方案文件夹(或项目文件夹)中名为“packages”的文件夹。如果指定 PackageReference,.NuGet 包将安装在您的项目中,并将下载到 %UserProfile%\.nuget\packages\<NuGet package name>,您的项目将在其中引用它,以确保您的所有项目都使用相同版本的 NuGet 包(它不会被复制到您的解决方案 folder/project 文件夹)。 .csproj 文件中的一些设置也不同。

您上面列出的文件可能来自 NuGet 包 DocumentFormat.OpenXmlSDK (v.2.0.0),它看起来需要 .NET 3.5。 newest/lastest OpenXml 的 NuGet 包是 DocumentFormat.OpenXml (v.2.12.1),DLL 存在于 .NET 3.5、.NET 4.0 和 .NET 4.6。

Package references (PackageReference) in project files and Migrate from packages.config to PackageReference

由于错误,多为您的电脑环境导致电脑找不到DocumentFormat.OpenXml.dll version 2.0.5022.0。因此,一种解决方案是将此 dll 添加到 GAC 中,以便您的环境可以找到它。

检查