背景介绍
移植代码,需要将目标框架 .NET Core 2.2 的代码移植到 .NET 7.0 框架下面
报错代码
using Dapper;
using Microsoft.Data.SqlClient;
namespace ConsoleDapper
{
internal class Program
{
static void Main(string[] args)
{
selectDemo();
Console.WriteLine("Hello, World!");
}
public static void selectDemo()
{
string sql = "SELECT TOP (100) * FROM T_Guarantee_Info ORDER BY ID DESC";
var ginfn = Conn.QueryFirst(sql);
if (ginfn == null)
{
}
if(!string.IsNullOrWhiteSpace(ginfn?.ID))
{
int id = int.Parse(ginfn?.ID);
}
}
public static SqlConnection Conn
{
get
{
return new SqlConnection("Server=118.XX.16.XXX;UID=ydb;PWD=Axxxx6;database=YxxxxxxxmDB;");
}
}
}
}
报错信息
2024/7/23 14:57:38
Recoverable
Microsoft.Build.Exceptions.BuildAbortedException: MSB4188: 已取消生成。
System.ArgumentException : 找不到适合此文件的引用类型: “C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll”。
at Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAVSReferences.Add(String bstrPath)
at Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem.VisualStudioWorkspaceImpl.ApplyMetadataReferenceAdded(ProjectId projectId,MetadataReference metadataReference)
at Microsoft.CodeAnalysis.Workspace.ApplyProjectChanges(ProjectChanges projectChanges)
at Microsoft.CodeAnalysis.Workspace.TryApplyChanges(Solution newSolution,IProgressTracker progressTracker)
at Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem.VisualStudioWorkspaceImpl.TryApplyChanges(Solution newSolution,IProgressTracker progressTracker)
at Microsoft.CodeAnalysis.CodeActions.ApplyChangesOperation.ApplyOrMergeChanges(Workspace workspace,Solution originalSolution,Solution changedSolution,IProgressTracker progressTracker,CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CodeActions.ApplyChangesOperation.TryApplyAsync(Workspace workspace,Solution originalSolution,IProgressTracker progressTracker,CancellationToken cancellationToken)
at async Microsoft.CodeAnalysis.CodeActions.CodeActionEditHandlerService.ProcessOperationsAsync(<未知参数>)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at async Microsoft.CodeAnalysis.CodeActions.CodeActionEditHandlerService.ApplyAsync(<未知参数>)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at async Microsoft.CodeAnalysis.Editor.Implementation.Suggestions.SuggestedAction.InvokeWorkerAsync(<未知参数>)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at async Microsoft.CodeAnalysis.Extensions.IExtensionManagerExtensions.PerformActionAsync(<未知参数>)
解决方案
这个错误 System.ArgumentException : 找不到适合此文件的引用类型 通常表示 Visual Studio 在尝试将某个引用(在这个案例中是 System.Data.dll)添加到项目中时遇到了问题。分析报错的原因大致有如下几个方向
- 引用路径错误:
确保 System.Data.dll 文件确实存在于你提供的路径 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.6.1\ 下。
有时候,尤其是在安装了多个版本的 .NET Framework 或进行了某些系统更新后,文件可能会被移动或删除。
-
项目目标框架与引用框架不匹配:
检查你的项目是否设置为使用 .NET Framework 4.6.1 或兼容版本。如果项目目标框架与引用的框架版本不匹配,Visual Studio 可能无法正确加载引用。 -
Visual Studio 或 .NET Framework 安装问题:
尝试重新安装或修复 Visual Studio 和 .NET Framework。
确保所有必要的更新都已安装。 -
项目文件损坏:
有时候,项目文件(如 .csproj)可能会损坏,导致无法正确解析引用。尝试关闭 Visual Studio,删除 .vs 文件夹(如果存在),然后重新打开项目。
结论是第一种,项目目标框架与引用框架不匹配.
在 .NET 7.0 或更高版本中,System.Data.SqlClient 已经被官方废弃,并被 Microsoft.Data.SqlClient 替代。
现在使用Microsoft.Data.SqlClient 替代:
使用 NuGet 包管理器来添加 Microsoft.Data.SqlClient NuGet 包
然后
using Microsoft.Data.SqlClient;
总结
//不同版本使用 SqlConnection
//netcore 2.2 引用DLL System.Data.SqlClient.dll
//NET 7.0 引用 Nuget Microsoft.Data.SqlClient
即可运行现在的代码.尽管 API 大部分是相似的,但总有一些小的差异需要注意。