![](/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.