【问题标题】:MissingMethodException after extracting base interface提取基本接口后的 MissingMethodException
【发布时间】:2019-03-08 10:55:17
【问题描述】:

我将 Nuget 包库中的一个接口拆分为一个更简单的基本接口(原始接口没有一个属性),并使原始接口派生自新的基本接口。

使用应用程序的实例化通过托管可扩展性框架 (MEF) 进行,使用带有 [Import] 属性的属性注入,以及带有 [Export(typeof(IFooConfigurations))] 的实现

对于使用旧接口和实现的应用程序,这不应该是一个重大更改。但在某些情况下,会加载不同的库,它们使用旧的接口版本和实现。这会导致运行时出现 MissingMethodExceptions,表示方法或属性(get 方法)不存在 - 例如示例中的 Configurations 列表属性。

旧:

public interface IFooConfigurations
{
    int ConfigurationsIdentifier { get; }

    IReadOnlyList<Configuration> Configurations { get; }
}

新功能:

public interface IBaseFooConfigurations
{
    // without the ConfigurationsIdentifier

    IReadOnlyList<Configuration> Configurations { get; }
}

public interface IFooConfigurations : IBaseFooConfigurations
{
    int ConfigurationsIdentifier { get; }

    // Configurations inherited from IBaseFooConfigurations
}

实施(未更改)

[Export(typeof(IFooConfigurations)]
public class FooConfigurations : IFooConfigurations
{
    // implementations of ConfigurationsIdentifier and Configurations 
}

用法(未更改),通过 MEF 解决

public class FooApplicationClass
{
    [Import]
    private IFooConfigurations ConfigurationsOwner { get; set; }
}

很难跟踪此错误并找到可能的原因,因为它不会发生在通常的开发环境中。

这可能是一个解决方案,使用new 关键字在新版本的IFooConfigurations 接口中复制现在位于基本接口中的所有旧属性和方法,同时仍然从新版本派生IBaseFooConfigurations?

可能的解决方案?

public interface IFooConfigurations : IBaseFooConfigurations
{
    int ConfigurationsIdentifier { get; }

    new IReadOnlyList<Configuration> Configurations { get; }
}

编辑:似乎保留原始接口的成员,用“new”关键字隐藏继承的成员,解决了问题。可能,使用原始接口的旧应用程序和库无法将继承的成员解析为原始接口的一部分。但是,显式实现和模拟可能会带来麻烦。还有待测试。

【问题讨论】:

  • 可能是某处的参考文献......

标签: c# .net interface mef missingmethodexception


【解决方案1】:

从另一个接口继承的接口成员不等同于在接口本身中定义的成员。因此,将成员移动到基本接口并从其继承,是一项重大更改。为了向下兼容,接口的成员也必须在自身中定义为“new”(在 C# 中)。

我通过一个简单的测试程序确认了这一点,引用了具有原始单一接口、拆分和另一个具有拆分和重复“新”成员的 DLL 的不同构建。所以这不是 MEF 的问题。

不幸的是,这个问题只发生在运行时,在已经构建了 nuget 包的发布之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2022-01-06
    • 2010-10-17
    相关资源
    最近更新 更多