.net core添加.net标准dll作为参考

时间:2018-04-16 07:36:17

标签: c# asp.net-core .net-core

创建.net标准dll,将其命名为Paas dll,然后更改输出路径 .. \输出\

添加类似下面的类记录器 -

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

现在在解决方案中创建另一个.net核心控制台项目,并为pass.dll添加dll作为refrence(而不是项目引用),并将copy local设置为false。

同时将控制台应用程序的输出目录更改为.. \ Output \

在控制台应用中添加以下代码 -

 var logger = new Logger();
  logger.LogMessage();
  Console.Read();

构建并运行.net核心应用程序,但现在应用程序进入中断模式且出现以下错误

  

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

但是,如果你使用.net框架4.6.1项目执行相同的步骤,为什么.net core存在这种不同的行为以及如何修复它?

项目展示此问题的

github链接 - https://github.com/ankgupta067/DependencyInjection.git

1 个答案:

答案 0 :(得分:2)

问题是在.NET上设置copy local to false.,为了知道应该加载哪些程序集,它使用在输出.dll旁边生成的所谓的.deps.json文件。为了生成此.deps.json文件,.NET Core SDK会检查有关您引用的程序集的信息。它使用的信息之一是参考是否为CopyLocal。请参阅code here。如果您检查控制台应用的.deps.json文件,则表示其中没有Paas.dll条目。

因此,为了使这项工作,需要正确编写.deps.json文件。使用当前工具,这意味着您必须停止将copy local设置为false。如果您想为此方案打开问题,请记录here。这样就可以在将来的版本中修复它。

OLD ANSWER:

基于SDK(&#34; .NET Core样式&#34;)。csproj项目和传统.csproj项目之间的区别在于默认情况下基于SDK的项目会将目标框架附加到<OutputPath>属性。

所以当你说

  

同时将控制台应用程序的输出目录更改为.. \ Output \

真正发生的是基于SDK的netstandard库的输出将转到..\Output\netstandard2.0\Paas.dll,基于SDK的控制台项目的输出将转到..\Output\netcoreapp2.0\。这是两个不同的目录,因此运行时无法找到库。

要停止此行为,请编辑两个.csproj文件并添加:

<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>

<PropertyGroup>元素内。

这将导致两个项目直接输出到指定的..\Output\文件夹。