为什么没有一个模块初始化火的接口使用

代码

所以我有两个组件为什么没有一个模块初始化火的接口使用

“AssemblyWithClassAndModuleInit”包含一个类

public class MyBaseClass 

{

}

“AssemblyWithInterfaceAndModuleInit”包含一个接口

public interface MyInterface 

{

}

两者都包含模块初始化器

public static class ModuleInitializer 

{

public static void Initialize()

{

Environment.SetEnvironmentVariable("ModuleInitializer", "true");

}

}

试验 “AssemblyWithClassAndModuleInit”(注意MyBaseClass用作基地ClassTests

[TestFixture] 

public class ClassTests : MyBaseClass

{

[Test]

public void EnsureModuleInitIsCalled()

{

Assert.AreEqual("true", Environment.GetEnvironmentVariable("ModuleInitializer"));

}

[Test]

public void EnsureAssemblyIsLoaded()

{

var assemblies = AppDomain.CurrentDomain.GetAssemblies();

Assert.IsTrue(assemblies.Any(x => x.GetName().Name == "AssemblyWithClassAndModuleInit"));

}

}

试验 “AssemblyWithInterfaceAndModuleInit”(注意MyInterface用作InterfaceTests的界面)

[TestFixture] 

public class InterfaceTests : MyInterface

{

[Test]

public void EnsureModuleInitIsCalled()

{

Assert.AreEqual("true", Environment.GetEnvironmentVariable("ModuleInitializer"));

}

[Test]

public void EnsureAssemblyIsLoaded()

{

var assemblies = AppDomain.CurrentDomain.GetAssemblies();

Assert.IsTrue(assemblies.Any(x => x.GetName().Name == "AssemblyWithInterfaceAndModuleInit"));

}

}

唯一失败的测试是InterfaceTests.EnsureModuleInitIsCalled

问题

那么为什么会这样呢?不应该InterfaceTests执行MyInterface导致模块初始值设定项运行的事实?

我如何注入模块初始化程序

我正在使用IL编织。具体https://github.com/Fody/ModuleInit

它检测到这个

public static class ModuleInitializer 

{

public static void Initialize()

{

//Init code

}

}

如果我添加一个字段Type interfaceType = typeof(MyInterface);InterfaceTests,那么所有的测试都通过了一旁补充说这

static <Module>() 

{

ModuleInitializer.Initialize();

}

更新

  • 作为。
  • 编码是针对.NET 4.5

全部来源

这里所做的是一个单位的摄制测试https://github.com/SimonCropp/Experiments/tree/master/ModuleInitRepro

回答:

一个明显的潜在相关的事情:你的测试类的基类中派生产品组装。因此,创建测试类的实例需要调用基类中的构造函数(隐式地),这意味着基类需要被完全加载和初始化,因此程序集需要被初始化。

将其与您的接口版本进行比较 - 在​​测试类中实现prod-assembly接口的事实在执行时是无关紧要的,因为您没有做任何需要接口的事情。

怀疑,如果你有:

public void Foo(MyInterface x) 

{

}

[Test]

public void EnsureAssemblyIsLoaded()

{

Foo(this);

... assertions ...

}

那么可以初始化组件。如果你有在接口中声明的任何方法,你叫这些方法之一从Foo,那么我肯定会想到要初始化的组件。

以上是 为什么没有一个模块初始化火的接口使用 的全部内容, 来源链接: utcz.com/qa/261488.html

回到顶部