将一个 .NET Standard DLL 添加为 .NET Core 的引用

3

创建一个 .net standard dll,将其命名为 Paas dll,并更改输出路径为 ..\Output\

添加下面这样的类记录器:

 public class Logger 
    {
        public void LogMessage()
        {
            Console.Write("test");
        }
    }

现在在解决方案中创建另一个 .net core 控制台项目,并将 pass.dll 作为引用添加(不是项目引用),并将复制本地设置为 false。
还要将控制台应用程序的输出目录更改为 ..\Output\。
在控制台应用程序中添加以下代码 -
 var logger = new Logger();
  logger.LogMessage();
  Console.Read();

构建和运行 .net core 应用程序时,但现在应用程序出现以下错误进入中断模式:

无法加载文件或程序集“Paas,Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”。系统找不到指定的文件。

但如果使用 .net framework 4.6.1 项目执行相同步骤,则可以正常工作,为什么会存在这种与 .net core 不同的行为,如何解决?
此问题的演示项目的 Github 链接: https://github.com/ankgupta067/DependencyInjection.git

应该可以正常工作。我认为目前的状态问题无法重现(至少对我来说是这样)。 - Evk
我不能说我在“新式”的.NET Core项目中看到过任何像那样的“旧式”引用(带有提示路径)。要在.csproj中重现它(即获取提示路径),您需要引用DLL文件而不是项目。唉,我只是想指出它仍然存在。 - ProgrammingLlama
1
我猜如果你必须那样做,你就得这么做。 (我仍然鼓励您尝试随着时间的推移远离它。)像Evk一样,我无法重现这个问题-我刚刚尝试使用Json.NET作为DLL引用来完成它,而且很好。当您构建项目时,您是否在输出目录中获得DLL,例如bin / debug / netcoreapp2.0? - Jon Skeet
看起来罪魁祸首是 <Private>false</Private>。如果你将其删除,它就会被复制到 bin\debug\netcoreapp2.0 目录下。 - Jon Skeet
让我们在聊天中继续这个讨论 - ankush
显示剩余11条评论
1个回答

2
问题在于将copy local设置为false。在.NET Core中,为了知道应该加载哪些程序集,它使用所谓的.deps.json文件,该文件会在输出的.dll旁生成。为了生成这个.deps.json文件,.NET Core SDK会检查有关您引用的程序集的信息。它使用的信息之一是参考是否为CopyLocal。请参见此处的代码。如果检查控制台应用程序的.deps.json文件,则会发现其中没有Paas.dll的条目。
因此,为了使其工作,.deps.json文件需要正确编写。使用当前的工具,这意味着您必须停止将复制本地设置为false。如果您想针对此方案打开问题,请在此处记录它。这样可以在未来的版本中修复它。
旧答案:SDK-based(".NET Core style").csproj项目和传统的.csproj项目之间的区别在于,默认情况下,SDK-based项目将目标框架附加到<OutputPath>属性。因此,当您说
也更改控制台应用程序的输出目录为..\Output\。
实际发生的情况是SDK-based netstandard库的输出将变为..\Output\netstandard2.0\Paas.dll,而SDK-based控制台项目的输出将变为..\Output\netcoreapp2.0\。这是两个不同的目录,因此运行时找不到库。
要停止此行为,请编辑两个.csproj文件并添加: <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath><PropertyGroup>元素内。
这将导致两个项目直接输出到指定的..\Output\文件夹。

好的,我在问题中忘记提到了,我也做了完整的GitHub链接项目,在这里https://github.com/ankgupta067/DependencyInjection.git。 - ankush
明白了。根据这些信息,我已经更新了我的答案。 - Eric Erhardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接