![](/img/trans.png)
[英]How to stop the resx file in my dll(reference) from being used in my main project?
[英]Read a file in Main Project from dll
我創建了一個項目,其中包含許多要在另一個項目中重復使用的自定義控件。 但是現在,當我想創建一個“ ad-control”用戶控件時,我需要為每個項目使用不同的廣告代碼。因此,如何向我的Main項目中添加配置文件並從dll中讀取該文件的密鑰?
例如 ,我使用了Google Analytics(分析),並看到當我將此引用安裝到我的項目中時,他們也添加了一個xml文件。
我想您可以使用XmlReader
。 您似乎在使用的GoogleAnalyticsSDK
軟件包中至少使用了這種方法。
您可以使用此鏈接簽出EasyTrackerConfig
類的源代碼,因為此庫源代碼已打開。
下面的代碼示例顯示了如何實例化XmlReader
。
var xmlReader = XmlReader.Create("analytics.xml");
然后,您可以檢查EasyTrackerConfig
類的Load
和LoadConfigXml
方法,以了解如何讀取屬性。 以防萬一下面提供了它們:
internal static EasyTrackerConfig Load(XmlReader reader)
{
// advance to first element
while (reader.NodeType != XmlNodeType.Element && !reader.EOF)
{
reader.Read();
}
if (!reader.EOF && reader.Name == "analytics")
{
return LoadConfigXml(reader);
}
return new EasyTrackerConfig();
}
private static EasyTrackerConfig LoadConfigXml(XmlReader reader)
{
var result = new EasyTrackerConfig();
reader.ReadStartElement("analytics");
do
{
if (reader.IsStartElement())
{
switch (reader.Name)
{
case "trackingId":
result.TrackingId = reader.ReadElementContentAsString();
break;
case "appName":
result.AppName = reader.ReadElementContentAsString();
break;
case "appVersion":
result.AppVersion = reader.ReadElementContentAsString();
break;
case "appId":
result.AppId = reader.ReadElementContentAsString();
break;
case "appInstallerId":
result.AppInstallerId = reader.ReadElementContentAsString();
break;
case "sampleFrequency":
result.SampleFrequency = reader.ReadElementContentAsFloat();
break;
case "dispatchPeriod":
var dispatchPeriodInSeconds = reader.ReadElementContentAsInt();
result.DispatchPeriod = TimeSpan.FromSeconds(dispatchPeriodInSeconds);
break;
case "sessionTimeout":
var sessionTimeoutInSeconds = reader.ReadElementContentAsInt();
result.SessionTimeout = (sessionTimeoutInSeconds >= 0) ? TimeSpan.FromSeconds(sessionTimeoutInSeconds) : (TimeSpan?)null;
break;
case "debug":
result.Debug = reader.ReadElementContentAsBoolean();
break;
case "autoAppLifetimeTracking":
result.AutoAppLifetimeTracking = reader.ReadElementContentAsBoolean();
break;
case "autoAppLifetimeMonitoring":
result.AutoAppLifetimeMonitoring = reader.ReadElementContentAsBoolean();
break;
case "anonymizeIp":
result.AnonymizeIp = reader.ReadElementContentAsBoolean();
break;
case "reportUncaughtExceptions":
result.ReportUncaughtExceptions = reader.ReadElementContentAsBoolean();
break;
case "useSecure":
result.UseSecure = reader.ReadElementContentAsBoolean();
break;
case "autoTrackNetworkConnectivity":
result.AutoTrackNetworkConnectivity = reader.ReadElementContentAsBoolean();
break;
default:
reader.Skip();
break;
}
}
else
{
reader.ReadEndElement();
break;
}
}
while (true);
return result;
}
您可以創建一個NuGet包並指定要包含在最終nupkg
文件中的文件。
轉到您的.csproj
文件夾並運行nuget spec
。 然后,修改生成的projectName.nuspec
文件以包含一個files
部分。 例如,在這里,我表明我希望將來自指定位置的所有txt文件復制到目標位置:
<files>
<file src="headers\*.txt" target="content\headers" />
</files>
target
位置是相對於packages/nameOfYourDll
而packages
是包含您通過NuGet下載的所有dlls
的文件夾。
下一步是使用nuget pack projectName.csproj
打包您的NuGet包。 這將產生一個projectName.nupkg
文件。 這就是通過NuGet Manager在另一個項目中部署dll的方式。
現在,您可以將dll上傳到NuGet或將其復制到驅動器上的某個位置。 使用第二個選項,然后可以進入Visual Studio的“工具”->“庫軟件包管理器”->“軟件包管理器設置”,然后從左側菜單中選擇“軟件包源”。 然后,您可以添加保存nupkg
文件的位置。
現在,您可以在項目中的“引用”上單擊鼠標右鍵,然后轉到“管理NuGet包”。 但是,您可以從左側菜單中選擇本地的NuGet“存儲庫”,而不是在nuget.org上進行搜索。 安裝選定的本地軟件包后,來自src
的文件將被復制到target
位置,並且您的dll將有權訪問它們。 您現在只需要查找有意義的路徑。
我們很快就給出了這個答案,但是如果您覺得有用的話,我可以澄清一下。
您可以使用配置文件並使用ConfigurationManager類讀取設置
因此,如果您有一個名為LibraryProject的圖書館項目,則可以通過以下方式訪問名為myKey
的設置:
string value = ConfigurationManager.AppSettings["myKey"];
此設置需要在主項目的配置文件中聲明,如果是Web項目,則在web.config
聲明;對於任何其他類型,則需要在app.config
中聲明(如果我沒記錯的話)。 在這些文件中,您可以在<appSettings>
部分中聲明自己的設置,如下所示:
<appSettings>
<add key="myKey" value="myValue"/>
</appSettings>
如果確實需要僅將設置存儲在庫項目的配置文件中,請查看此問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.