2010-11-26 75 views
6

在VB.Net項目中,您可以使用屬性頁面的設置選項卡來定義應用程序設置。要引用代碼中的設置,可以使用VB中的語法My.Settings.SettingName。如何參考另一個項目的應用程序設置?

在設置選項卡上,您可以選擇訪問修飾符。它可能是「朋友」或「公共」。據推測,當您選擇「公共」時,您正在使其他程序集可以訪問該設置。但是,一旦選擇「Public」,我就無法弄清楚引用另一個項目的設置的語法。實際上,我無法觀察使用「內部」與「公共」作爲訪問修飾符的區別。

我的問題:選擇「公共」作爲訪問修飾符使設置可以訪問其他程序集?如果是這樣,引用其他程序集設置的語法是什麼?如果不是,那麼「公共」是做什麼的?

+0

我本來以爲應用VB和C#這個問題,所以我要求這兩種語言的問題。然而,我現在意識到我誤解了C# - 關於那裏的語法沒有神祕感(使用[Namespace] .Properties.Settings.Default。[SettingName])。但是,我仍然沒有弄清楚VB的語法,所以我編輯了這個問題只適用於VB,並且我繼續尋求該語言的答案。 – 2010-11-26 22:25:12

回答

6

你正在混淆很糟糕的事情。一個設置沒有可訪問性修飾符,它們總是公開的。但是,在Winforms應用程序中,確實在控件的「屬性」窗口中有一個「應用程序設置」屬性。在頂部。還有一個Modifier屬性。後者是朋友默認情況下在一個VB.NET項目,私人在C#應用程序。這決定了控制變量的可訪問性,而不是設置。

是的,My.Settings可讓您訪問存儲控件屬性值的設置。但這正是好消息結束的地方。您應該始終將設置設計器中的設置範圍設置爲用戶。這樣,當程序開始備份時,可以保存和恢復該值。

用戶範圍的設置存儲在很難找回的文件中。這種文件的典型路徑是C:\ Users \ hpassant \ AppData \ Local \ WindowsFormsApplication1 \ WindowsFormsApplication1._Url_2acx4ldi2zmg42elj3eyqq0snhqco4qe \ 1.0.0.0

第一部分是我,我的筆記本電腦的當前用戶。路徑名稱的bizarro部分是散列值,這是應用程序名稱和版本唯一的值。當我編譯應用程序時,可能還有其他類似月球的相位。計算該散列的算法沒有記錄。只是它對我的應用來說是獨一無二的,不能被另一個應用踩踏。

這就是蹭,一個應用程序找不到另一個應用程序的用戶範圍設置。如果這對你很重要,你將不得不放棄使用設置。並用一個知名位置的XmlDocument替換它。

+0

Hans,謝謝你的回覆。我不明白細節,但我想我明白了結論 - 「一個應用程序無法找到其他應用程序的用戶範圍設置」。但是,這裏有關嗎?我並沒有試圖讓一個應用程序讀取另一個應用程序的設置;我試圖讓一個項目讀取(並寫入)其引用的另一個項目的設置。 – 2010-11-26 22:50:11

+2

是的,我認爲這是相關的,我的答案的任期。你不能*寫*另一個應用程序的設置。除非他們在您認識的可寫位置*。你知道他們在哪裏得救嗎? – 2010-11-26 22:57:42

0

我想你可以通過你的設置實例從一個DLL對象到另一個DLL(在應用程序啓動時說的),然後使用這個類的項目屬性訪問設置(設置類是從ApplicationSettingsBase繼承類)

'在DLL1: 的Class1 共享屬性SettingsFromAnotherDLL作爲ApplicationSettingsBase ...

' 在DLL2:(在啓動時進行) Class1.SettingsFromAnotherDLL = My.Settings.Default

「在DLL2訪問設置時 昏暗環境作爲字符串= Class1.SettingsFromAnotherDLL.Item(‘SettingKey’)

+0

邁克,我嘗試了類似於你的建議。我創建了一個單例,它有效地包裝Settings單例並將其公開。無論設置訪問修飾符是設置爲「朋友」還是「公共」,這都可以工作。我希望,一旦我明白其目的,「公共」選項將導致更簡單的解決方案。 – 2010-11-26 23:12:25

0

下面是示例代碼來獲得的設置命名的任何DataBaseName值。EXE靠近我們執行的應用程序並將其存儲在「數據庫名」變量:

string currentDirectory = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
string exeName = System.IO.Path.GetFileName(Assembly.GetExecutingAssembly().Location); 
FileInfo[] fileInfos = new DirectoryInfo(currentDirectory).GetFiles("*.exe"); 
foreach (FileInfo fi in fileInfos) 
{ 
    if (fi.FullName == System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) continue; 

    Assembly asm = Assembly.LoadFrom(fi.FullName); 
    Type[] allTypes = asm.GetTypes(); 
    foreach (Type type in allTypes) 
    { 
     if (type.Name != "Settings") continue; 
     Type settingsType = type; 

     PropertyInfo propDefault = type.GetProperty("Default"); 
     object defaultSettings = propDefault.GetValue(null, null); 
     PropertyInfo piDBName = settingsType.GetProperty("DataBaseName"); 
     string dbName = (string)piDBName.GetValue(defaultSettings, null); 

     break; 
    } 

    break; 
} 
3

我一直在尋找同樣的事情,所以這個吧:
在C#:
[命名空間] .Properties.Settings.Default [SettingName]
在VB:
[命名空間] .My.MySettings.Default [SettingName]