C# .NET Core与Classic:编译泛型类型的差异。错误:";类型'';在部件中定义的;
我们有三个大会: 组件1(标准) Assembly2(标准)参考Assembly1C# .NET Core与Classic:编译泛型类型的差异。错误:";类型'';在部件中定义的;,c#,.net,compilation,visual-studio-2017,assembly-references,C#,.net,Compilation,Visual Studio 2017,Assembly References,我们有三个大会: 组件1(标准) Assembly2(标准)参考Assembly1 public class ClassChild: ClassParent{ } Assembly3(使用共享项目)引用Assembly2 public interface IGeneric<T>{ } public class GenericClass: IGeneric<ClassChild>{ } IGeneric公共接口{ } 公共类GenericClass:IGene
public class ClassChild: ClassParent{
}
Assembly3(使用共享项目)引用Assembly2
public interface IGeneric<T>{
}
public class GenericClass: IGeneric<ClassChild>{
}
IGeneric公共接口{
}
公共类GenericClass:IGeneric{
}
使用“共享项目”表示整个解决方案包含5个项目“Assembly1”、“Assembly2”、“Assembly3(共享项目)”、“Assembly3核心目标”、“Assembly3经典NETFremework目标”
并在Visual Studio 2017中编译它们
如果目标是核心,则编译确定。
但是当目标为classic时。NETFramework会出现错误:
错误CS0012类型“ClassParent”是在以下程序集中定义的
未引用。必须添加对程序集“”的引用
有趣的是,编译后的核心程序集不包含对Assembly1的引用(dotPeek disasm)
因此,我无法解释核心成功的原因是什么:编译器本身或管理编译的VisualStudio工具
无论如何,我们能不能处理这个“错误”并强制Visual Studio为.NETFramework编译assmebly?不添加“直接”引用(以清除引用列表)
更新:
我不想添加额外参考的原因:因为在现实生活中,它是一个Microsoft.EntityFrameworkCore,集合了20个额外参考,之后的参考列表将包括每个.NET标准库(意味着参考列表失去了其信息含义).要在.NET Framework 4.5+和.NET Core 1.0+之间共享库,您需要将这些库作为目标。当然,.NET标准程序集只能使用其他.NET标准程序集,因此这意味着您必须将所有嵌套依赖项的.NET标准作为目标,无论它们在图形中有多深 请注意,.NET标准不能用于可执行文件,但对于那些需要针对.NET标准可以使用的一个(或多个)平台的可执行文件(.NET Framework、.NET Core、Xamarin.iOS等)
Assembly1
、Assembly2
和Assembly3(共享项目)
只需要目标.NET标准
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
</PropertyGroup>
...
</Project>
请注意,VisualStudio不包含任何工具来帮助您管理此类条件,您必须手动编辑项目文件来管理它们。在Visual Studio 2017中,您只需右键单击解决方案资源管理器中的项目节点,然后单击
编辑.csproj
,即可打开编辑器。如果目标是核心,则编译确定
-哪个目标?您提到您有3个不同的程序集,当然每个程序集都有自己的目标。汇编程序集3(文件在共享项目中定义)是的,情况更复杂。Assembly1和Assembly2是标准配置。在共享项目中定义的Assembly3源。它会更改Assembly1
和Assembly2
,以便.NET Core和.NET Framework都可以使用它们。如果它们以.NET Framework为目标,则.NET核心无法识别它们(因此会显示错误消息)。如果程序集以.NET Core为目标,并且您尝试使用.NET Framework使用它们,您也会收到类似的错误消息。但我只想将引用列表保存为与.NET Core目标相同的clear for.NET Framework标记集。多目标有帮助吗?我添加了.csproj
项目文件的外观。希望这能让事情变得更清楚。当然,…
部分应该删除,并替换为项目的真实XML。谢谢。我的Assembly1和Assembly2是allready标准(Assembly3是共享项目,在两个目标关联之间共享)。我的问题不是如何“组织”解决方案,而是如何解释为什么在.NET Framework的情况下,我应该向目标程序集添加附加引用,并且可以避免这种情况(在实际情况下,我需要添加大量程序集)。
Assembly3 (netstandard2.0) -- (Shared Project)
\
Assembly2 (netstandard2.0)
\
Assembly1 (netstandard2.0)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
</PropertyGroup>
...
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netcoreapp2.0;net462</TargetFrameworks>
</PropertyGroup>
<!-- non-conditional reference for all target frameworks -->
<ItemGroup>
<ProjectReference Include="..\Assembly2\Assembly2.csproj" />
</ItemGroup>
<!-- conditional references that only apply to netcoreapp2.0 -->
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.0' ">
<!-- for projects within the same solution -->
<ProjectReference Include="..\Assembly1\Assembly1.csproj" />
<!-- for NuGet references -->
<PackageReference Include="System.Globalization.Extensions" Version="4.3.0" />
</ItemGroup>
</Project>