0

我试图了解 Web 应用程序环境中的执行顺序 - 基本上我正在使用用于各种实用功能的模块,包括记录和初始化各种全局/共享变量。该网站有几个独立的页面和一些网络服务。

我们在网站上遇到了一些问题,其中一位开发人员建议必须首先执行一段代码来初始化一个关键属性(这发生在模块构造函数中,属性本身没有在模块中定义,但是而不是在第 3 方 DLL 上,模块只是在构造函数中启动它)没有首先执行。该开发人员背后的原因是“只有在打开的页面上找到对它的引用时才会调用模块的构造函数。

所以让我们想象一下我们的 Web 应用程序上有 2 个页面。只有 Page2 引用了 MyModule。所以这个开发者的逻辑是,如果网站重新启动并且第一次调用是 Page1,它没有对模块的任何引用,因此没有调用构造函数,因此它不会在第 3 方初始化这个属性动态链接库。因此,Page1 尝试使用具有未初始化属性的 3rd 方 DLL,但它失败了。

我的反驳是:模块是一个共享类,它的构造函数也是共享的,在加载 Web 应用程序的程序集时正在初始化。根据我的论点,首先加载哪个页面并不重要,构造函数在程序集加载时启动第 3 方工具,因此问题出在其他地方。

我是对的还是错的?我找不到我的问题的答案,只是一些关于 Module 与 C# 静态类相似但又不同的信息。

谢谢

Public Module MyModule
    Sub New()
        Log("something")
        myThirdPartyDLLReference.InitializeVars()
        ...
    End Sub

Private Sub Log(ByVal logMessage as string)
    ' Do some logic. Log some information
End Sub 

End Module

Partial Class Page1
    Inherits Page

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        ' Do some logic, no references to MyModule
    End Sub
End Class

Partial Class Page2
    Inherits Page

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        ' Do some logic, initialize MyModule
        MyModule.Log("Page 2 initialized")
    End Sub
End Class
4

1 回答 1

3

您的开发人员是对的。模块仅在需要时加载,因为程序启动时模块列表为空 https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.modules?view=netframework-4.7.2

这也是我的经验,也体现在你的经验中

于 2019-04-12T22:06:09.167 回答