【问题标题】:I can't read my embedded XML file from my second C# project我无法从我的第二个 C# 项目中读取嵌入的 XML 文件
【发布时间】:2015-03-10 15:16:18
【问题描述】:

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

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

因此,我在我的 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 文件,我想出了这个解决方案。请记住插入您自己的项目名称和类名称,而不是我的占位符( 等)。

//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 visual-studio-2012 embedded-resource


    【解决方案1】:

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

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

    试试这个

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

    希望这会有所帮助。

    【讨论】:

    • 您将编写 SomeTypeFormThatAssembly,但我如何知道我的 Windows 服务程序集的类型是什么?
    • @Rohwedder 你不知道那个程序集中的任何class or enum or struct or delegate
    • 我发现现在应该是什么类型它应该是我的windows服务项目命名空间的类型,然后是服务类。我的 Windows 服务称为 MySQLBackupService,我的服务类称为 MySQLBackupService,因此类型应为 MySQLBackupService.MySQLBackupService。我无法理解的问题是,我需要在我的 WPF 项目中包含对命名空间 System.ServiceProcess 的引用,以便将 MySQLBackupService 类用作命名空间类型。我已经更新了我的原始帖子,以包含我的解决方案,因此其他人可能可以从我的帖子中获得帮助。
    【解决方案2】:

    如果你的类是静态类,那么使用这个方法:

    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多