我正在尝试将 xml 文件加载到方法中来处理它。我有两个项目:
SignalServer
和DbLibrary
。在 DbLibrary
内部有一个类 SQLQuery
,它有一个方法 GetResourceTextFile(string xmlFile)
。该方法在 SignalServer
中被调用,如下所示:
SQLQueries.GetResourceTextFile("SignalServer.HubQueries.xml");
在此方法中,我尝试从 xml 文件加载资源:
using (Stream resourceStream = Assembly.GetCallingAssembly()
.GetManifestResourceStream(xmlFile)){}
但是,
GetManifestResourceStream
似乎没有获得任何传递给它的资源。事实上,当我使用以下内容进行调试时:
string [] p = Assembly.GetCallingAssembly().GetManifestResourceNames();
数组为空。
我尝试加载的文件位于 SignalServer 目录中。为什么
GetManifestResourceStream
看不到它,我该如何解决这个问题?谢谢!
将文件放入目录中并不会使其成为资源。 您需要在项目构建过程中嵌入文件作为资源。
使用 Visual Studio,您可以激活要嵌入的文件的属性控件,并将属性“Build Action”更改为“Embedded Resource”。
假设您的文件名称是“Resources/SignalServer.HubQueries.xml”,该路径相对于项目文件的位置。然后它将添加到您的 .NET 项目文件中:
<ItemGroup>
<EmbeddedResource Include="Resources/SignalServer.HubQueries.xml" />
</ItemGroup>
如果您愿意,可以使用文本编辑器手动添加这些 XML 元素。
在运行时,您可以按照您尝试使用和解析资源流的方式读取它。有用。如果我们假设您只有一个嵌入式资源,您的代码可以是这样的:
System.Reflection.Assembly assembly =
System.Reflection.Assembly.GetEntryAssembly();
// or GetExecutingAssembly, depending on in which assembly
var names = assembly.GetManifestResourceNames();
if (names.Length < 1) return; // or something
using var stream = assembly.GetManifestResourceStream($"{names[0]}")!;
using var streamReader = new System.IO.StreamReader(stream,
System.Text.Encoding.UTF8);
// read text from streamReader or pass it to XML parser
这是一篇有用的文章,详细说明了如何使用嵌入式资源:https://khalidabuhakmeh.com/how-to-use-embedded-resources-in-dotnet。