创建.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
答案 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。这样就可以在将来的版本中修复它。
基于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\
文件夹。