最初我编写了多个代码生成器(需要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
注释这些行,它就可以正常工作。
删除 PrivateAssets="all" 属性或使用 PrivateAssets="compile"
进行更改