我有一个控制台应用程序和一个图书馆. 中的控制台应用程序是.NET 8,而库是.NET 6.

控制台应用程序只是将该库作为项目引用来使用,并使用我创建的一些代码(使用反射)来确定DLL使用的是哪个.NET版本.

另一方面,库应用程序使用一个包(在本例中为System.Reflection,但不会对其做任何操作).

一旦我发布了控制台应用程序(使用dotnet publish),我希望至少csproj库中的包引用是.NET 6,但事实并非如此.

我创建了一个示例应用程序供您判断:https://github.com/tbragaf/TestNet6WithNet8.

在这里,我有我遵循的步骤和我得到的输出触发是这样的:

TestNet6WithNet8/AppInNet8/bin/Release/net8.0/osx-arm64/publish/System.Reflection.dll; .NETCoreApp,Version=v8.0;

你能解释一下为什么这个DLL指向.NET 8,而不是.NET 6吗?还是我做错了什么?(可能).事实上,只有库DLL指向.NET 6.

也许我看到的DLL是应用程序使用的,但是库中的DLL在哪里呢?

谢谢你的帮助,

我原以为System.Reflection.dll的目标是.NET 6,因为类库使用它,而它的目标是.NET 6.


Update:为了便于阅读,下面你可以找到Cprojs.

AppInNET8.csproj

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <RuntimeIdentifiers>win-x64;win-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
    </PropertyGroup>

    <ItemGroup>
      <ProjectReference Include="..\LibraryInNet6\LibraryInNet6.csproj" />
    </ItemGroup>
</Project>

LibInNET6.csproj

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="System.Reflection" Version="4.3.0" />
    </ItemGroup>
</Project>

推荐答案

输出路径TestNet6WithNet8/AppInNet8/bin/Release/net8.0/osx-arm64/publish/完全取决于应用程序的目标运行时间.由于您的应用程序以.NET8为目标,所以一切都将在此结束.发布步骤将所有依赖项(在本例中是库和nuget中的dll)复制到该文件夹中,完全独立于那些依赖项的编译方式.

该文件夹包含在另一台计算机上运行应用程序所需的所有内容(假设它安装了框架,如果发布者不是"独立于框架的").如果你需要在不同的文件夹中一起搜索东西,那就太难看了.如果您有一个名为TestNet6WithNet8/AppInNet8/bin/Release/net6.0/osx-arm64/publish/的文件夹,它将包含在.NET6.0下运行的所有二进制文件.

无论你的库的目标运行时是什么,如果应用程序的目标是8.0,它都会针对. NET 8.0运行时执行.运行库是向后兼容的(除了极少数例外),因此任何为. NET 6.0编译的库都可以在. NET 8.0运行库中正常运行.当然,这只是向前工作,所以. NET 8.0应用程序可以引用. NET 6.0 DLL,但不能反过来.

Csharp相关问答推荐

如何使用Automapper映射两个嵌套列表

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

MongoDB实体框架核心:表达必须可写

如何从顶部提取发票号作为单词发票后的第一个匹配

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

在. net毛伊岛窗口的深度链接已经创建""

将列表字符串映射为逗号分隔字符串<>

在具有主构造函数的类中初始化属性时出现警告

如何在NodaTime中为Instant添加一年?

如何比较C#中的L和ł(波兰字符)返回TRUE

依赖项注入、工厂方法和处置困境

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

MudBlazor Textfield已禁用,但其验证工作正常

C#无法将.csv列转换为用于JSON转换的列表

Autofac -动态实例化:手动传递构造函数

将列表转换为带有逗号分隔字符串形式的值的字典

如何对列表<;列表>;使用集合表达式?

C#中的逻辑运算符用作单词';is';and';and';

C#、Visual Studio代码、调试器、错误处理变量请求.未知错误:0x80131502,