如何让.NET Framework 4.6项目引用.NET Framework 4.8第三方类库?
解决方法
以下是几个可行的方案,按操作复杂度从低到高排序:
方案1:修改项目配置与绑定重定向
- 打开你的.NET 4.6项目的
.csproj文件,找到引用第三方4.8库的<Reference>节点,修改为:
<Reference Include="你的第三方库名称"> <HintPath>库文件的本地路径,比如..\libs\ThirdParty.dll</HintPath> <SpecificVersion>False</SpecificVersion> <Private>True</Private> </Reference>
- 在项目的
<PropertyGroup>节点下添加以下配置,关闭框架版本检查并自动生成绑定重定向:
<AutoGenerateBindingRedirects>True</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>True</GenerateBindingRedirectsOutputType> <DisableFrameworkAssemblyCheck>True</DisableFrameworkAssemblyCheck>
- 打开项目的
app.config(Web项目则是web.config),在<runtime>节点内添加绑定重定向规则:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="你的第三方库名称" publicKeyToken="库的公钥令牌" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.8.0.0" newVersion="4.8.0.0" /> </dependentAssembly> </assemblyBinding>
- 公钥令牌可通过VS开发者命令提示符获取,执行
sn -T 你的第三方库.dll即可得到。
方案2:反编译并重编译第三方库为4.6目标
因为已知该库未使用4.8专属功能,可直接修改它的目标框架版本:
- 打开VS开发者命令提示符,用ildasm反编译库文件:
ildasm /out=ThirdParty.il ThirdParty.dll
- 用文本编辑器打开生成的
ThirdParty.il文件,找到.assembly节点下的TargetFrameworkAttribute配置,将其中的v4.8改为v4.6,对应的十六进制部分也要修改(把34 2E 38换成34 2E 36),比如原代码可能是:
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1A 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B 2C 56 65 72 73 69 6F 6E 3D 76 34 2E 38 00 00 )
修改后变成:
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1A 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B 2C 56 65 72 73 69 6F 6E 3D 76 34 2E 36 00 00 )
- 再用ilasm重新编译为4.6目标的dll:
ilasm /dll /resource=ThirdParty.res ThirdParty.il
- 将生成的新dll替换原引用,直接在4.6项目中引用即可,不会再出现版本错误。
方案3:创建适配代理项目
如果上面两种方法都不适用,可以做一个中间代理层:
- 创建一个目标框架为.NET Framework4.8的类库项目,引用第三方4.8库,然后封装所有需要用到的功能,暴露成4.6兼容的接口(避免使用4.8新增的语法或类型)。
- 将这个代理项目编译为dll,然后在你的4.6项目中引用这个代理dll,同时在4.6项目的
app.config中添加绑定重定向,确保代理dll能正确加载第三方库。
内容的提问来源于stack exchange,提问作者TomB
相关产品推荐
相关产品推荐

