我正在研究一个包含两个项目的解决方案,一个是.NET Core 3项目,另一个是.NET Framework 4.7.2项目。 .NET Framework 4.7.2项目具有一个在方法上使用 HttpPostedFileBase 的类。
问题是,当我使用Autofac在.NET Core项目上注册该类时,出现此错误:
无法从程序集中加载类型“ System.Web.HttpPostedFileBase ” 'System.Web,版本= 4.0.0.0,文化=中性, PublicKeyToken = b03f5f7f11d50a3a'。
我知道 HttpPostedFileBase 在.NET Core 3的System.Web上不存在,所以我的猜测是,当我尝试向Autofac注册该类时,正在使用的System.Web是一个来自我的.NET Core项目,而不是来自.NET Framework项目。尝试仅将另一个项目中的System.Web用于我的.NET Core项目是否可行?
我尝试将其他项目中的System.Web.dll添加到我的.NET Core项目中,但出现错误:
发生一个或多个错误。该引用无效或不受支持。
答案 0 :(得分:2)
我希望这个答案可以帮助您走上正确的轨道。
我想不出解决您问题的几种选择:
1。完全放弃.NET Framework
如果可能的话,使用.NET Framework 4.7.2更改项目以使用.NET Standard,并改写有问题的方法,完全放弃.NET Standard。从某些方面来说,这是更简单的选择,我建议您尽可能使用它。
2。同时定位.NET Standard和.NET Framework
如果由于某些问题(例如该项目用于无法定位myObj
的其他解决方案中,则可以使该项目同时面向两个平台。
您可以通过VisualStudio或直接在csproj文件编辑.NET Standard
属性中以较新的csproj格式进行第二种选择(强烈建议您使用某些向导将项目迁移到新格式)。然后,应在csproj的TargetFramework
上添加条件,以仅在使用ItemGroup
时包含System.Web
,而在使用.NET Framework 4.7.2
时包含.NET Standard
。然后使用.NET Standard
重新编写有问题的方法,但不要删除旧的方法。相反,您应该使用.NET Standard
编译器指令使编译器选择正确的编译器。
下面您可以找到具有新csproj格式的示例。如果您使用的是旧版本,则可以使用THIS WIZARD自动迁移。
#if
应更改为(注意<TargetFramework>net472</TargetFramework>
):
s
然后仅在使用<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
时包括System.Web
:
net472
.NET Standard之后也是如此。
最后一部分应使用C#代码本身完成:
<ItemGroup Condition=" '$(TargetFramework)' == 'net472' ">
<Reference Include="System.Web" />
</ItemGroup>
上面使用的常量-NETSTANDARD和NETFRAMEWORK是通配符,用于提到的平台的更特定版本。您可以全部找到它们HERE
您可能被迫对有问题的方法的调用者做类似的事情。
如果这些事情不能解决问题,您可能需要检查程序集绑定重定向,因为我所发布的此问题可能不是唯一的问题。
祝你好运,希望我的回答有任何帮助。
答案 1 :(得分:0)
由于某种原因,当我注册正在与Autofac讨论的类时,如下所示:builder.RegisterType().EnableClassInterceptors()。InterceptedBy(typeof(LogInterceptors),typeof(CacheInterceptor));然后删除类拦截器,并注册类似builder.RegisterType();的类。 ,然后错误消失了。