GetManifestResourceNames 返回空数组

问题描述 投票:0回答:1

我正在尝试将 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
看不到它,我该如何解决这个问题?谢谢!

c# xml reflection
1个回答
0
投票

将文件放入目录中并不会使其成为资源。 您需要在项目构建过程中嵌入文件作为资源。

使用 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

© www.soinside.com 2019 - 2024. All rights reserved.