编码
所以我有两个程序集
“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
}
}
并添加了这个
static <Module>()
{
ModuleInitializer.Initialize();
}
更新
- 顺便说一句,如果我添加一个字段
Type interfaceType = typeof(MyInterface);
,InterfaceTests
那么所有测试都会通过。 - 编码是针对 .net 4.5 完成的
完整来源
这是带有单元测试的重现https://github.com/SimonCropp/Experiments/tree/master/ModuleInitRepro