2010-03-30 219 views
31

有沒有辦法從不同的項目訪問設置文件?例如,我有一個包含2個項目的解決方案(讓我們稱它們爲Proj1和Proj2)。我想從Proj1的Program.cs中訪問Proj2的應用程序設置。這可能嗎?訪問另一個項目的設置文件

回答

31

選項A:解析值出來的其它組件的配置文件(其中,被存儲在設置)

選項B的:在Proj2從其設置爲靜態屬性暴露必要的值創建一個公共類,然後參考Proj1中的程序集並使用該類的值。選項C:如果要公開所有設置,可以將設置類的訪問權限從internal修改爲public

我確定還有其他的方法。

+3

我使用選項B,這是第一個想到的我也是如此。謝謝! – KrisTrip 2010-03-31 13:25:06

+0

我試過選項C,似乎沒有工作。我爲每個項目分別提供了一套設置:/ – Patrick 2015-08-27 13:25:57

+0

選項C對我來說就像一個魅力。 – 2017-11-28 13:06:09

42

答案如果您使用C#:
非常簡單的答案是右鍵單擊proj2,選擇設置選項卡。在頂部,您會發現設置類的訪問修飾符是:internal,將其更改爲public。在proj1中添加對proj2的引用以查看proj2 Settings類。就這樣。

+6

好吧,這絕對有意義,但你應該如何改變這些設置而無需編譯? 可以說你部署了項目A,引用了項目B的設置。你想修改項目B的設置,但是你擁有的是缺省值編譯到dll中?因爲這是唯一的解釋,我可以找到,因爲沒有配置文件部署或與項目A的設置合併。 – mikus 2013-11-22 15:38:16

+0

我試過這個,它的工作原理,但它有@ mikus聲明的限制。另外,如果您正在使用XML轉換(例如SlowCheetah),Proj1將無法看到轉換的更改,即使是重新編譯也是如此。 – 2014-04-09 18:41:52

+0

不適合我。 – Patrick 2015-08-27 13:27:09

-1

我沒有測試此方法自己,但埃裏克·德Carufel的小動作,可能是你需要的東西:

http://blog.decarufel.net/2007/10/getting-access-to-settings-in-another.html

原路段似乎是死的,因爲他已經搬到了一個新的博客,並刪除舊內容。

原始內容如下:

獲取訪問設置在另一個項目

週四,2007年10月25日

一個Visual Studio 2005中的新的很酷的功能是新的屬性編輯器。使用此屬性編輯器,您可以輕鬆地將設置添加到您的應用程序。但它的推動方式是一個問題。讓我解釋你爲什麼。

通常這些設置是特定於項目的。在項目中添加設置時,與設置文件關聯的特殊定製工具將生成一個新類,您可以使用該類來訪問它。這個課程有什麼好處是它的強類型。但在幕後,它只是從一個XML文件中獲得一個密鑰。這個生成的類被設置爲「內部密封」。這可以防止從任何其他程序集訪問。如果您想要集中編輯這些設置的位置,該怎麼辦?

經過多次試圖揭露它,我發現一個簡單的方法來做到這一點。假設我們的解決方案中有2個項目:引擎和WinApp。每個都有設置,但我們希望它們可以從WinApp進行編輯。這是它的樣子。

如果你想在這裏獲得引擎設置的技巧:添加一個鏈接文件。

鏈接文件將作爲WinApp項目的一部分進行編譯。設置類仍然是內部密封的,但對於WinApp項目而不是引擎。

下面是最終的結果:

請注意,我就將此具有相同的名稱作爲我的引擎項目foler。如果你想添加許多項目的設置,這將會很有幫助。

有了這個地方,你可以訪問你的發動機從你的發動機類作爲您WinApp類設置的方式。您可以省略引擎類中的「引擎」部分,因爲您應該位於相同的名稱空間中。下面是它應該是什麼樣子:

命名空間WinApp { 公共部分Form1類:表格{ 公共 Form1的(){ 在InitializeComponent (); }

public void AccessConfig() 
    { 
     Engine.Properties.Settings.Default.EngineSetting = "test"; 
    } 
} 

}

+1

鏈接已死亡 – Kuffs 2017-04-23 10:18:13

+0

找到與此處鏈接並複製的原始內容(博客現已停止) – Kildareflare 2017-07-23 22:41:57

0

我不得不拿出除了含有的設置我的項目的App.config中,因爲我是用XML Tranforms(通過SlowCheetah)已經在這裏給出的那些另一種解決方案。如果你不這樣做,我推薦其他解決方案之一。

我加入後生成步驟在消費項目(Proj1中的例子),以配置文件從Proj2的輸出文件夾中複製。這將確保配置將應用轉換。 (在我的情況,Proj1是一個DLL,所以,如果你是一個exe,該DestinationFiles從 「.dll.config」 到名爲 「.exe.config」 改變。)段從Proj1.csproj:然後

<Target Name="AfterBuild"> 
    <Copy SourceFiles="..\Proj2\bin\$(Configuration)\Proj2.exe.config" DestinationFiles="$(TargetDir)\$(AssemblyName).dll.config" /> 
</Target> 

我通過ctrl + shift +將文件拖到Proj1中創建了Proj2的Settings.settings鏈接(如在Kildareflare引用的博客文章中)。

我可以再引用Proj1類似的設置:Proj2.Properties.Settings.Default.MySetting

注意:如果您正在爲像我這樣的單元測試執行此操作(Proj1是一個測試DLL),並且您正在使用ReSharper測試運行器,請務必configure it to run tests in separate AppDomains

1

我將重新發布@ Kildareflare鏈接的內容以供將來參考。仍然適用於VS2015,但對於我自己,我認爲我更喜歡上面的「選項B」。

獲取訪問設置在另一個項目

一個Visual Studio 2005中的新的很酷的功能是新的屬性編輯器。使用此屬性編輯器,您可以輕鬆地將設置添加到您的應用程序。但是它的實施方式存在問題。讓我解釋你爲什麼。

通常這些設置是特定於項目的。在項目中添加設置時,與設置文件關聯的特殊定製工具將生成一個新類,您可以使用該類來訪問它。這個課程有什麼好處是它的強類型。但在幕後,它只是從一個XML文件中獲得一個密鑰。這個生成的類被設置爲「內部密封」。這防止從任何其他程序集訪問。如果您想要集中編輯這些設置的位置,該怎麼辦?

經過多次試圖揭露它,我發現一個簡單的方法來做到這一點。假設我們的解決方案中有2個項目:引擎和WinApp。每個都有設置,但我們希望它們可以從WinApp進行編輯。這是它的樣子。

Settings Before

如果你想獲得發動機設置在這裏的伎倆:添加一個鏈接文件。

Add Link

鏈接文件將被編譯成部分,你WinApp項目。設置類仍然是內部密封的,但對於WinApp項目而不是引擎。

下面是最終的結果:我添加的文件夾具有相同的名稱作爲我的引擎項目

Settings After

通知。如果您想添加許多項目的設置,這將會很有幫助。

有了這個地方,你可以訪問你的發動機從你的發動機類作爲您WinApp類設置的方式。您可以省略引擎類中的「引擎」部分,因爲您應該位於相同的名稱空間中。下面是它應該是什麼樣子:

namespace WinApp 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void AccessConfig() 
     { 
      Engine.Properties.Settings.Default.EngineSetting = "test"; 
     } 
    } 
} 
+0

這對我無效。由於其保護級別,我仍然無法訪問'設置' – Mugen 2017-10-31 09:07:52

0

由於Settings.Designer.cs是一個internal類,你不想惹生成的代碼文件,我會建議添加輔助的「朋友」項目。

來源:C# "internal" access modifier when doing unit testing

添加以下代碼到Proj2AssemblyInfo.cs

using System.Runtime.CompilerServices; 

[assembly:InternalsVisibleTo("Proj1")] 
相關問題