我无法从第二个C#项目中读取我的嵌入式XML文件

时间:2013-07-25 20:19:36

标签: c# xml visual-studio-2012 embedded-resource

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

第一个项目是一个Windows服务,该项目在一个文件夹(称为配置)中包含一个XML文件。此XML文件称为Databases.xml。我已将Databases.xml Build Action从内容更改为嵌入式资源,现在我想从我的解决方案中的其他项目访问此XML文件,这是一个WPF应用程序。

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

我的问题是,当我尝试访问嵌入式资源时,我无法找出要使用的类型以及我的程序集和XML文件的路径/命名空间应该是什么。当我使用

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

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

请帮帮我,因为这个问题让我疯了。

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

我的解决方案更新26-07-2013

我发现当我无法使用我的第一个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引用包含到我的第二个项目中。

2 个答案:

答案 0 :(得分:2)

您可以参考Windows Service project Assembly使其正常工作

您的代码问题This.GetType().Assesmbly提供了当前Assembly在您的案例中WPF Assembly,显然您在那里找不到您需要的内容。

试试这个

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

希望这有帮助。

答案 1 :(得分:0)

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

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();
            }
        }
    }

例如,如果此项目中的嵌入式资源文件名是&#39; MyFile.txt&#39;然后使用这个静态方法相同的代码:

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