有沒有辦法從不同的項目訪問設置文件?例如,我有一個包含2個項目的解決方案(讓我們稱它們爲Proj1和Proj2)。我想從Proj1的Program.cs中訪問Proj2的應用程序設置。這可能嗎?訪問另一個項目的設置文件
回答
選項A:解析值出來的其它組件的配置文件(其中,被存儲在設置)
選項B的:在Proj2
從其設置爲靜態屬性暴露必要的值創建一個公共類,然後參考Proj1
中的程序集並使用該類的值。選項C:如果要公開所有設置,可以將設置類的訪問權限從internal
修改爲public
。
我確定還有其他的方法。
答案如果您使用C#:
非常簡單的答案是右鍵單擊proj2,選擇設置選項卡。在頂部,您會發現設置類的訪問修飾符是:internal,將其更改爲public。在proj1中添加對proj2的引用以查看proj2 Settings類。就這樣。
好吧,這絕對有意義,但你應該如何改變這些設置而無需編譯? 可以說你部署了項目A,引用了項目B的設置。你想修改項目B的設置,但是你擁有的是缺省值編譯到dll中?因爲這是唯一的解釋,我可以找到,因爲沒有配置文件部署或與項目A的設置合併。 – mikus 2013-11-22 15:38:16
我試過這個,它的工作原理,但它有@ mikus聲明的限制。另外,如果您正在使用XML轉換(例如SlowCheetah),Proj1將無法看到轉換的更改,即使是重新編譯也是如此。 – 2014-04-09 18:41:52
不適合我。 – Patrick 2015-08-27 13:27:09
我沒有測試此方法自己,但埃裏克·德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";
}
}
}
鏈接已死亡 – Kuffs 2017-04-23 10:18:13
找到與此處鏈接並複製的原始內容(博客現已停止) – Kildareflare 2017-07-23 22:41:57
我不得不拿出除了含有的設置我的項目的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。
我將重新發布@ Kildareflare鏈接的內容以供將來參考。仍然適用於VS2015,但對於我自己,我認爲我更喜歡上面的「選項B」。
獲取訪問設置在另一個項目
一個Visual Studio 2005中的新的很酷的功能是新的屬性編輯器。使用此屬性編輯器,您可以輕鬆地將設置添加到您的應用程序。但是它的實施方式存在問題。讓我解釋你爲什麼。
通常這些設置是特定於項目的。在項目中添加設置時,與設置文件關聯的特殊定製工具將生成一個新類,您可以使用該類來訪問它。這個課程有什麼好處是它的強類型。但在幕後,它只是從一個XML文件中獲得一個密鑰。這個生成的類被設置爲「內部密封」。這防止從任何其他程序集訪問。如果您想要集中編輯這些設置的位置,該怎麼辦?
經過多次試圖揭露它,我發現一個簡單的方法來做到這一點。假設我們的解決方案中有2個項目:引擎和WinApp。每個都有設置,但我們希望它們可以從WinApp進行編輯。這是它的樣子。
如果你想獲得發動機設置在這裏的伎倆:添加一個鏈接文件。
鏈接文件將被編譯成部分,你WinApp項目。設置類仍然是內部密封的,但對於WinApp項目而不是引擎。
下面是最終的結果:我添加的文件夾具有相同的名稱作爲我的引擎項目
通知。如果您想添加許多項目的設置,這將會很有幫助。
有了這個地方,你可以訪問你的發動機從你的發動機類作爲您WinApp類設置的方式。您可以省略引擎類中的「引擎」部分,因爲您應該位於相同的名稱空間中。下面是它應該是什麼樣子:
namespace WinApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void AccessConfig()
{
Engine.Properties.Settings.Default.EngineSetting = "test";
}
}
}
這對我無效。由於其保護級別,我仍然無法訪問'設置' – Mugen 2017-10-31 09:07:52
由於Settings.Designer.cs
是一個internal
類,你不想惹生成的代碼文件,我會建議添加輔助的「朋友」項目。
來源:C# "internal" access modifier when doing unit testing
添加以下代碼到Proj2
的AssemblyInfo.cs
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("Proj1")]
- 1. ExtJS視口訪問另一個項目的一個項目
- 2. 訪問TOMCAT中的另一個項目
- 3. 從java中的另一個項目訪問包和類文件
- 4. 如何從一個項目訪問webservice到另一個項目
- 5. 從另一個項目訪問resx資源文件
- 6. 如何從另一個項目和包中訪問.java文件?
- 7. 從另一個web項目訪問Sitecore
- 8. 在同一個項目中的另一個文件夾中訪問類(Xcode)
- 9. 訪問maven項目中的類到另一個java項目
- 10. 項目設置:讓一個Web項目依賴於另一個項目
- 11. 訪問另一個文件中的var
- 12. 設置作曲家安裝在另一個項目文件夾爲新的項目文件夾
- 13. 合併wcf app.config與另一個配置文件的另一個項目?
- 14. 在一個php文件中設置數組並訪問另一個php文件問題
- 15. 在另一個表單上訪問/設置控件
- 16. 如何設置另一個項目的目標
- 17. 從另一個文件訪問變量
- 18. 訪問在另一個.cpp文件
- 19. 無法訪問在另一個文件
- 20. 訪問另一個XML文件
- 21. 如何導入項目設置從一個Xcode項目到另一個
- 22. 從一個不同的項目訪問DataDirectory文件夾C#
- 23. @PropertySource從另一個項目加載另一個屬性文件
- 24. 從頁面在根目錄訪問另一個文件夾頁
- 25. 如何從另一個項目的jsp訪問Axis1 webservice?
- 26. 訪問另一個項目的版本信息
- 27. 訪問另一個項目的xib和類?
- 28. Bigquery:如何訪問Bigquery JAVA API中的另一個項目?
- 29. 從android中的另一個項目訪問活動
- 30. C++和C#IoT - C++項目訪問另一個項目中的C#DLL
我使用選項B,這是第一個想到的我也是如此。謝謝! – KrisTrip 2010-03-31 13:25:06
我試過選項C,似乎沒有工作。我爲每個項目分別提供了一套設置:/ – Patrick 2015-08-27 13:25:57
選項C對我來說就像一個魅力。 – 2017-11-28 13:06:09