我有一个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引用包含到我的第二个项目中。
答案 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");