3

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

第一个项目是一个 Windows 服务,该项目在一个文件夹中包含一个 XML 文件(称为配置)。此 XML 文件称为 Databases.xml。我已将 Databases.xml 构建操作从内容更改为嵌入式资源,现在我想从我的解决方案中的其他项目(即 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 文件,我想出了这个解决方案。请记住插入您自己的项目名称和类名称,而不是我的占位符(<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 引用包含到我的第二个项目中。

4

2 回答 2

2

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

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

试试这个

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

希望这可以帮助。

于 2013-07-25T20:30:26.003 回答
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();
            }
        }
    }

例如,如果您在此项目上的嵌入式资源文件名是“MyFile.txt”,则使用此静态方法与此代码相同:

var myFileData = GetFromResources("MyFile.txt");
于 2015-03-10T05:43:28.433 回答