gpt4 book ai didi

c# - Assembly.GetCallingAssembly() 和静态构造函数?

转载 作者:太空狗 更新时间:2023-10-29 21:26:02 27 4
gpt4 key购买 nike

好的,所以我遇到了以下令人侧目的问题。

出于各种原因,我有一个测试设置,其中 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。

将变量设置为非静态变量并在常规构造函数中对其进行初始化修复了此问题,但我很困惑为什么这恰好开始了。我认为静态构造函数在第一次引用静态成员时运行。这只能来 self 的 TestingAssembly,它应该是调用者。有谁知道可能发生了什么?

最佳答案

静态构造函数由运行时调用,而不是直接由用户代码调用。您可以通过在构造函数中设置断点然后在调试器中运行来查看这一点。调用链中紧靠其上方的函数是 native 代码。

编辑:静态初始化程序有多种方式可以在与其他用户代码不同的环境中运行。其他一些方式是

  1. 它们受到隐式保护,免受多线程导致的竞争条件的影响
  2. 您不能从初始化程序外部捕获异常

一般来说,最好不要将它们用于任何过于复杂的事情。您可以使用以下模式实现单初始化:

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;
}
}

如果您希望多线程访问,请添加锁定。

关于c# - Assembly.GetCallingAssembly() 和静态构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/121946/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com