我创建了一个项目,其中包含许多自定义控件,可以在其他项目中重复使用。但现在我想创建一个广告控制" usercontrol,我需要为每个项目使用不同的广告代码。那么如何将配置文件添加到我的主项目并从我的dll中读取该文件的密钥?
例如,我使用谷歌分析,并看到当我将此引用安装到我的项目时,他们也添加了一个xml文件。
答案 0 :(得分:1)
我想你可以使用XmlReader
。至少这种方法用在您似乎使用的GoogleAnalyticsSDK
包中。
您可以使用此link查看EasyTrackerConfig
类的源代码,因为此库源代码已打开。
下面是代码示例,展示了XmlReader
如何实例化。
var xmlReader = XmlReader.Create("analytics.xml");
然后,您可以查看Load
类的LoadConfigXml
和EasyTrackerConfig
方法,了解如何读取属性。
以防万一在下面提供:
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;
}
答案 1 :(得分:1)
您可以创建一个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 - &gt;库包管理器 - &gt;包管理器设置,然后从左侧菜单中选择包源。然后,您可以添加自己保存nupkg
文件的位置。
您现在可以右键单击项目中的“引用”,然后转到“管理NuGet包”。但是,您可以从左侧菜单中选择您当地的NuGet'存储库',而不是在nuget.org上搜索。安装选定的本地软件包后,src
中的文件将被复制到target
位置,您的dll将可以访问它们。你现在必须找到有意义的路径。
这个答案是匆忙给出的,但如果你发现它有用,我可以加上澄清。
答案 2 :(得分:0)
您可以使用配置文件并使用ConfigurationManager Class
阅读设置因此,如果您有一个名为LibraryProject的库项目,则可以使用
访问名为myKey
的设置
string value = ConfigurationManager.AppSettings["myKey"];
此设置需要在主项目的配置文件中声明,如果是Web项目则为web.config
,对于任何其他类型(如果我没有记错的话)app.config
。在这些文件中,您可以声明
<appSettings>
部分中您自己的设置,如:
<appSettings>
<add key="myKey" value="myValue"/>
</appSettings>
如果您确实只需要将设置存储在库项目的配置文件中,请查看this question