我可以';我没有从第二个C#项目中读取嵌入的XML文件

本文关键字:读取 项目 文件 XML 第二个 我可以 | 更新日期: 2023-09-27 18:25:02

我有一个Visual Studio解决方案,里面有两个项目。

第一个项目是windows服务,该项目在一个文件夹中包含一个XML文件(称为Configurations)。这个XML文件名为Databases.XML。我已经将Databases.XML构建操作从内容更改为嵌入式资源,现在我想从我的解决方案中的另一个项目访问这个XML文件,该项目是一个WPF应用程序。

因此,我在WPF项目中添加了一个对windows服务项目的引用,现在我想从WPF项目访问我的XML文件。

我的问题是,当我试图访问嵌入式资源时,我找不到该使用哪种类型,以及我的程序集和XML文件的路径/命名空间应该是什么

string[] names = this.GetType().Assembly.GetManifestResourceNames();

我的名称数组是用我的WPF项目中的一些资源填充的。我想要的是从我的Windows服务项目访问ResourceNames,当然还有Databases.xml文件。

请帮帮我,因为这个问题快把我逼疯了。

如果您需要任何其他信息,请告诉我。

我的解决方案更新2013年7月26日

我发现真正的问题发生在我不能使用我的第一个windows服务项目命名空间作为程序集的类型时。我的Windows服务由一个服务类组成(里面有OnStart()和OnStop()方法),为了使用这个类作为我的命名空间类型,我需要添加另一个对我的WPF项目的引用。我需要添加对System.ServiceProcess命名空间的引用,以便在WPF项目中将我的Windows服务类用作程序集的类型。

为了访问我的Databases.xml文件,我提出了这个解决方案。请记住插入您自己的项目名称和类名,而不是我的占位符(<Windows服务项目名称>等)。

//Remember to add a reference to System.ServiceProcess in order to be able to use your WIndows Service Project as an assembly type.
using (Stream stream = typeof(<Windows Service Project Name>.<Windows Service Class Name>).Assembly.GetManifestResourceStream("<Windows Service Project Name>.<Folder Name>.Databases.xml"))
{
    //Load XML File here, for instance with XmlDocument Class
    XmlDocument doc = new XmlDocument();
    doc.Load(stream);
}

所以我真正的问题是,我没有将System.ServiceProcess引用包含到我的第二个项目中。

我可以';我没有从第二个C#项目中读取嵌入的XML文件

您必须参考Windows Service project Assembly才能使其在中工作

你的代码的问题是This.GetType().Assesmbly给出了当前的Assembly。在你的情况下是WPF Assembly,显然你在那里找不到你需要的东西。

试试这个

Assembly windowsServiceAssembly = typeof(SomeTypeFromThatAssembly).Assembly;
string[] names = windowsServiceAssembly.GetManifestResourceNames();

希望这能有所帮助。

如果您的类是静态类,则使用以下方法:

internal static string GetFromResources(string resourceName)
    {
        var asm = Assembly.GetExecutingAssembly();
        var resource = asm.GetManifestResourceNames().First(res => res.EndsWith(resourceName, StringComparison.OrdinalIgnoreCase));
        using (var stream = asm.GetManifestResourceStream(resource))
        {
            if (stream == null) return string.Empty;
            using (var reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }

例如,如果你在这个项目上嵌入的资源文件名是"MyFile.txt",那么使用这个静态方法,就像这个代码一样:

var myFileData = GetFromResources("MyFile.txt");