代码之家  ›  专栏  ›  技术社区  ›  Keithius

当.NET程序集被“引用”时,用户作用域设置会发生什么?

  •  0
  • Keithius  · 技术社区  · 15 年前

    我有一个独立的WinForms应用程序,我们称之为“程序A”。程序A让用户创建一个文件并保存一些信息。程序A还公开了一些公共类。

    另一个独立的WinForms应用程序(“程序B”)引用程序A,并使用它的一些公共类。

    但是,程序A的一些类需要打开用户创建的文件,以便从中检索数据。在程序A中,用户文件的位置保存在“设置”(当然是作为用户范围设置)中,并通过 My.Settings .

    这一切都很好,直到程序B运行-当它运行并使用程序A中需要从程序A中读取的类时 我的设置 ,设置为空-就好像它们被重置了一样(就像您第一次运行程序A或在新的用户帐户下)。任何 适用范围 保留设置,但任何 用户范围 设置被重置为它们的默认值(当程序A被写入时,它们在IDE中被设置为什么)。

    下面是一个伪代码示例:

    程序A:

    Namespace ProgramA
    
        Public Class Foo
    
            Public Shared Function GetStuff() as Object
                File = OpenFile(My.Settings.UserFileName)
                Return File.ReadStuff()
            End Function
    
        End Class
    
    End Namespace
    

    程序B:

    TheStuffIWant = ProgramA.Foo.GetStuff()
    

    假设用户已经至少运行了一次程序A并打开了一个文件,那么程序A My.Settings.UserFileName 应该设置。

    当程序B调用时 Foo.GetStuff() ,它不会返回任何内容,因为 我的.settings.userfilename 不包含用户的文件名-更准确地说,它包含该设置的“默认”值(如在第一次设置设置时在IDE中设置的)。但是,如果你转身启动程序A,它会记住用户的设置 UserFileName .

    所以-问题是: 在引用程序集中调用函数时,为什么不保留用户的设置?对我所看到的行为有什么解释吗,还是我遗漏了一些非常明显的东西?或者也许我只是把这一切搞错了,我不应该让程序A中的任何公共类依赖于 我的设置 首先?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Randolpho    15 年前

    您的问题是,用户范围的设置是由正在执行的应用程序读取的。因为您引用的是程序B中的程序A,而不是 执行 程序A,程序A中的类试图获取程序B未读取的设置。

    重点是程序B有自己的设置,这些设置与程序A分开,程序B正在执行的任何类(无论其定义在哪里)都将使用程序B的设置。

    所以如果你的设置是这样的话,你就不走运了。

    如果同时控制程序A和程序B,则可以为这两者编写自定义设置提供程序,以便它们共享公共用户范围设置。

    这个 Application Settings Architecture 本文有一个关于如何做到这一点的小节。