从dll读取Main Project中的文件

时间:2014-10-25 09:46:43

标签: c# windows-phone-8

我创建了一个项目,其中包含许多自定义控件,可以在其他项目中重复使用。但现在我想创建一个广告控制" usercontrol,我需要为每个项目使用不同的广告代码。那么如何将配置文件添加到我的主项目并从我的dll中读取该文件的密钥?

例如,我使用谷歌分析,并看到当我将此引用安装到我的项目时,他们也添加了一个xml文件。

enter image description here

3 个答案:

答案 0 :(得分:1)

我想你可以使用XmlReader。至少这种方法用在您似乎使用的GoogleAnalyticsSDK包中。

您可以使用此link查看EasyTrackerConfig类的源代码,因为此库源代码已打开。

下面是代码示例,展示了XmlReader如何实例化。

var xmlReader = XmlReader.Create("analytics.xml");

然后,您可以查看Load类的LoadConfigXmlEasyTrackerConfig方法,了解如何读取属性。 以防万一在下面提供:

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/nameOfYourDllpackages是包含您通过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