好的,所以我遇到了以下问题引起了人们的注意.
由于各种原因,我有一个测试设置,其中TestingAssembly.dll中的测试类依赖于BaseTestingAssembly.dll中的TestingBase类.TestBase在此期间所做的一件事就是在自己和调用程序集中查找某个嵌入式资源
所以我的BaseTestingAssembly包含以下几行......
public class TestBase { private static Assembly _assembly; private static Assembly _calling_assembly; static TestBase() { _assembly = Assembly.GetExecutingAssembly(); _calling_assembly = Assembly.GetCallingAssembly(); } }
静态,因为我想,这些程序集在应用程序的生命周期内是相同的,所以为什么还要在每次测试时重新计算它们.
在运行时,我注意到_assembly和_calling_assembly分别设置为BaseTestingAssembly而不是BaseTestingAssembly和TestingAssembly.
将变量设置为非静态并将它们初始化为常规构造函数修复此问题,但我很困惑为什么会发生这种情况.我认为静态构造函数在第一次引用静态成员时运行.这可能只来自我的TestingAssembly,那时应该是调用者.有谁知道可能发生了什么?
静态构造函数由运行时调用,而不是由用户代码直接调用.您可以通过在构造函数中设置断点然后在调试器中运行来查看.调用链中紧邻其上方的函数是本机代码.
编辑:静态初始化程序在与其他用户代码不同的环境中运行的方式有很多种.其他一些方法
它们被隐含地保护免受多线程导致的竞争条件的影响
您无法从初始化程序之外捕获异常
一般来说,最好不要将它们用于任何过于复杂的事物.您可以使用以下模式实现single-init:
private static Assembly _assembly; private static Assembly Assembly { get { if (_assembly == null) _assembly = Assembly.GetExecutingAssembly(); return _assembly; } } private static Assembly _calling_assembly; private static Assembly CallingAssembly { get { if (_calling_assembly == null) _calling_assembly = Assembly.GetCallingAssembly(); return _calling_assembly; } }
如果您期望多线程访问,请添加锁定.