Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Core与Classic:编译泛型类型的差异。错误:";类型'';在部件中定义的;_C#_.net_Compilation_Visual Studio 2017_Assembly References - Fatal编程技术网

C# .NET Core与Classic:编译泛型类型的差异。错误:";类型'';在部件中定义的;

C# .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

我们有三个大会:

组件1(标准)

Assembly2(标准)参考Assembly1

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>