如果存在对 CodeAnalysis.CSharp 的引用,则无法引用 netstandard2.0 库

问题描述 投票:0回答:1

背景

最初我编写了多个代码生成器(需要netstandard2.0),并希望将通用功能提取到一个库(也是netstandard2.0)中。但是,当尝试引用该库时,我总是收到一条错误消息,指出未找到 .dll 文件,即使它存在。我花了 3 个小时浏览网页并进行调试,下面你可以找到一个 MRE。我还不确定这是否是我面临的完全相同的问题,因为它抱怨的是 Microsoft 的 dll 而不是我自己的,但我仍然希望对此的修复也能解决我的问题。我知道该软件包有较新版本可用,但我无法让代码生成器与较新版本一起运行,所以我坚持使用这个。

问题

我怎样才能让它运行?

重现步骤:

在 VS 17.9.3 中,创建一个新的控制台应用程序 TargetFramework net8.0。

在同一个解决方案中,添加一个新的库项目,TargetFramework netstandard2.0。

MyLib.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" />
    </ItemGroup>
</Project>

Class1.cs

using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace MyLib
{
    public class Class1
    {
        public int GetNumber()
        {
            AttributeSyntax node = null;
            return 1337;
        }
    }
}

在同一解决方案中,添加第二个新库项目 TargetFramework netstandard2.0:

MySecondLib.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\MyLib\MyLib.csproj" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" />
  </ItemGroup>

</Project>

Class2.cs

using Microsoft.CodeAnalysis.CSharp.Syntax;
using MyLib;
using System;

namespace MySecondLib
{
    public class Class2 : Class1
    {
        public void PrintNumber()
        {
            AttributeSyntax node = null;
            Console.WriteLine(GetNumber());
        }
    }
}

对于原始控制台应用程序,使用以下文件: NetStandardReProduction.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\MySecondLib\MySecondLib.csproj" />
  </ItemGroup>

</Project>

程序.cs

using MySecondLib;

namespace NetStandardReproduction
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var obj = new Class2();
            obj.PrintNumber();
        }
    }
}

它会构建得很好,但是当你运行它时,它会失败并出现无法处理的异常:

System.IO.FileNotFoundException:“无法加载文件或程序集“Microsoft.CodeAnalysis.CSharp,版本= 4.7.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35”。系统找不到指定的文件。'

如果您从两个包中删除引用并用

AttributeSyntax
注释这些行,它就可以正常工作。

c# dll shared-libraries .net-standard-2.0
1个回答
0
投票

删除 PrivateAssets="all" 属性或使用 PrivateAssets="compile"

进行更改
© www.soinside.com 2019 - 2024. All rights reserved.