类属性说“找不到文件” ...甚至没有被初始化?

时间:2018-08-17 14:57:04

标签: c# visual-studio-2017

我现在有最奇怪的问题...

我正在研究一个试图实例化另一个项目中的类型(DbContext派生类)的程序。因为DbContext不仅接受标准参数,而且仅接受来自其他项目的接口,所以我不得不采用其他项目的某些程序集并引用它们,以便我可以创建实现接口的伪类型。

主要是这个:

class ContextConfigurationDummy:IContextConfiguration
    {
        #region privates
        private ILogger GetLoggerDummy() => new LoggerDummy();
        private ITenantSchemaResolver GetSchemaResolverDummy() => new SchemaResolverDummy();
        private CultureInfo GetUserCulture() => new CultureInfo("en-US");
        private DatabaseMetadata GetDbMetadata() => new DatabaseMetadata();
        private IEntityValidatorFactory GetValidatorFactory() => new ValidatorFactoryDummy();
        #endregion

        public DbConnection GetDbConnection() => new SqlConnection(@"[insert connection string]");
        public RuminantDummy GetRuminant() => new RuminantDummy();
        public Func<CultureInfo> UserCulture { get; set; }
        public Func<DbConnection> Connection { get; set; }
        public Func<IDatabaseMappingRuminant> Ruminant { get; set; }
        public Func<DatabaseMetadata> DatabaseMetadata { get; set; }
        public IEntityValidatorFactory ValidatorFactory { get; set; }
        public Func<ITenantSchemaResolver> TenantSchemaResolver { get; set; }
        public Func<ILogger> Logger { get; set; }
        public ContextConfigurationDummy()
        {
            UserCulture = GetUserCulture;
            Connection = GetDbConnection;
            Ruminant = GetRuminant;
            DatabaseMetadata = GetDbMetadata;
            ValidatorFactory = GetValidatorFactory();
            TenantSchemaResolver = GetSchemaResolverDummy;
            Logger = GetLoggerDummy;

        }
    }

原始界面是这样:

public interface IContextConfiguration
  {
    Func<CultureInfo> UserCulture { get; set; }

    Func<DbConnection> Connection { get; set; }

    Func<IDatabaseMappingRuminant> Ruminant { get; set; }

    Func<DatabaseMetadata> DatabaseMetadata { get; set; }

    IEntityValidatorFactory ValidatorFactory { get; set; }

    Func<ITenantSchemaResolver> TenantSchemaResolver { get; set; }

    Func<ILogger> Logger { get; set; }
  }

一切工作都很好,当我完成后,我有一阵子没看代码的一部分,对其余部分做了相当多的更改(包括对项目本身进行了调整以适应持续集成)我再次开始测试,并且在调用ContextConfigurationDummy的构造函数时遇到了这个问题:

Image here

请注意调试器还没有尝试评估它! “正常”错误是该值为null,并且在尝试对其求值后会出现某种异常。不在这里。此类中甚至没有任何文件正在加载。以下所有字段都存在相同的错误

我认为在处理项目结构时必须弄坏一些东西,所以我重新制作了整个项目,只接受了代码,重新引用了程序集,将所有内容保留为默认值...并且再次出现了完全相同的错误。因此,必须是正确的代码吗?

好吧,我通过git恢复到一个旧的提交,运行了程序,一切正常运行。大。检查了代码-相关部分完全相同,但命名空间略有改动。所以,代码也不一样吗?

我回到了当前的提交,并尝试了各种方式引用外部程序集之后,我再次尝试了其他方法:只是为了lulz,我进入了Main(主程序),并尝试使用实例化该类。与我最初实例化它的方式完全相同:var dummy = new ContextConfigurationDummy();

有效。一切都按预期进行,我的课只正常实例化。

但是,这似乎还不够奇怪,我会为您做一个更好的事情:

在主程序中调用该方法后,我保持程序运行。回到最初称为new ContextConfigurationDummy()的地方。回到构造函数中,它也在那里工作。将线路拉出主线-不起作用。返回-重新工作。

我很困惑,请帮助。 (并且不要告诉我清理解决方案,我已经做了一百次,并且从字面上重做了整个过程)。

1 个答案:

答案 0 :(得分:0)

我正在有效地结合自己的经验和此处的一些google-fu来组合答案。

.NET版本 确保您使用的是相同的.NET版本。我在用旧的.NET版本创建新项目的地方就遇到了这个问题,而这个问题使我完全陷入困境。

程序集名称

请确保没有一个dll与要引入的程序集具有相同的名称。如果您有两个MyAssembly.dll,则可能是错误的一个/版本。另外,如果您在某个时候更新了另一个项目,请检查所有引用是否都使用引入的dll的相同版本。

坚果包装

您是否还更新了项目中其他程序集所需的任何Nuget软件包? (我在单元测试中已经做过很多次了)如果是这样,您要么需要将其他项目的nuget包更新到同一版本,要么可能要添加一个App.Config文件来告诉它使用更新的版本。 / p>

我从来没有遇到过相同的程序集名称问题,但是有好几次我都遇到过nuget软件包问题和.net版本问题(这就是你根本不考虑的问题)