System.ArgumentException : 找不到适合此文件的引用类型

背景介绍

移植代码,需要将目标框架 .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 大部分是相似的,但总有一些小的差异需要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值