【发布时间】:2019-11-04 18:33:04
【问题描述】:
我尝试在 .NET Framework ASP.NET Web 应用程序中使用 .NET Standard 库,但我经常遇到与类型加载相关的错误。我已将问题重现如下:
https://github.com/sgarshol/VTSample
我已经建立了一个简单的.NET Standard 2.0 库,只有一个类:
namespace VTLib
{
public class VTMaker
{
public (int, string) GetVT()
{
return (3, "value");
}
}
}
我在控制台应用程序和ASP.NET MVC 应用程序中引用了这个库作为项目引用,两者都是.NET Framework v4.6.2。两个项目都实例化该类并调用GetVT()。
控制台应用程序运行良好。
Web 应用程序没有,我收到以下错误:
无法加载文件或程序集“System.ValueTuple,Version=0.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
检查我的 web application/bin 文件夹,我发现以下.dlls:
/bin/System.ValueTuple.dll (4.0.2.0, msil, .Net Framework v4.0) /bin/roslyn/System.ValueTuple.dll(4.0.1.0,msil,.Net Framework v.4.6.2)
使用 JetBrains dotPeek,我检查了我的 Web 应用程序 .dll 和我的库 .dll 并收集了以下信息:
- Web 应用程序 .dll 引用 System.ValueTuple (4.0.2.0),但 .csproj 文件不包含此类引用。
- .dll 库引用 netstandard (2.0.0.0) 作为其单一引用。
我发现我可以通过在 Web.config 文件中手动添加程序集重定向指令来“解决”问题:
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
【问题讨论】:
-
您是否使用过 Nuget 包管理器将 System.ValueTuple 引入您的项目?
-
@IrishChieftain 将 System.ValueTuple 添加到 Web 应用程序引用对问题没有任何明显影响:到 /bin 文件夹的相关 .dll 输出保持不变;错误仍然存在。
-
我问的原因是因为我在包文件中没有看到它,所以我认为明确地这样做可能值得一试;-)
-
@irishchieftain 我避免添加包以将项目保持在最低限度:没有它它构建得很好。但是我确实根据您的建议对包含的软件包(没有骰子!)进行了测试,因此感谢您的意见:)
-
我们刚刚在工作中遇到了非常相似的事情。我认为 .net 框架 46x 项目引用 .net 标准库的自动绑定重定向生成存在错误,无法正确解决依赖关系。作为参考,4.0.2 = nuget 4.4 和 4.0.3 = nuget 4.5。为什么会发生这种情况是因为您使用的是仅存在于 .net framework 4.7+ 中的 C# 7.0 功能,因此为了在 .net 462 中使用它,您需要引入一个额外的 dll。我相信这就是为什么它会感到困惑并且没有通过正常的 nuget 依赖解决过程。
标签: c# asp.net .net-standard .net-framework-version