我可以';我没有从第二个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引用包含到我的第二个项目中。
您必须参考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");