仅在appsettings中引用时不会复制Serilog Sink ddls

时间:2018-03-29 11:44:36

标签: serilog

我在一个提供日志记录服务的横切dll中使用带有接收器File和RollingFile的serilog。我正在使用Appsettings nuget进行配置,因此我对所提到的接收器没有静态依赖性。但是我确实在运行时需要它们,它们不会被复制到应用程序的bin文件夹,只会复制到dll的bin文件夹中。这意味着我得到一个Runtime Exception,因为sink-dlls不在那里。有办法解决这个问题吗?我的解决方法是创建一个我从不使用的RollingFileSink类型的变量。但它有点难看。更新:该解决方案在Release btw中不起作用。

1 个答案:

答案 0 :(得分:0)

我之前遇到过Serilog这个问题,我解决它的方法是通过我在AssemblyInfo.cs内部声明的程序集级别属性创建对我需要的程序集内部类型的静态引用主要项目。

这样的事情:

[assembly: ImplicitDependency(typeof(Serilog.Sinks.RollingFile.RollingFileSink))]
[assembly: ImplicitDependency(typeof(Serilog.Sinks.File.PeriodicFlushToDiskSink))]
// etc...

这是我在项目中创建的属性......

/// <summary>
/// Indicates that the marked assembly depends on the type that is specified in the constructor.
/// Typically used to force a compile-time dependency to the assembly that contains the type.
/// </summary>
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class ImplicitDependencyAttribute : Attribute
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ImplicitDependencyAttribute"/> class.
    /// </summary>
    /// <param name="dependencyType">A type from the assembly that is used dynamically.</param>
    public ImplicitDependencyAttribute(Type dependencyType)
    {
        DependencyType = dependencyType;
    }

    /// <summary>
    /// Gets the dependent type reference.
    /// </summary>
    /// <value>The dependent type reference.</value>
    public Type DependencyType { get; private set; }
}