在C#中向DLL添加资源(XML)

4
我有一个项目结构如下:
    /build-out/MyApp.dll
    /dependencies/ResFile.xml
    /src/MyFile.cs

MyFile.cs中,我想打开在/dependencies目录下的ResFile.xml文件,并读取其中的一些内容。当我在Visual Studio中使用时,一切都很顺利,但是当我创建一个dll并将其用作其他应用程序(作为外部库)时,我会得到一个错误,因为它找不到 dependencies/ResFile.xml 文件。
所以,资源文件如何添加到生成的MyApp.dll文件中呢?

2
在将应用程序部署到用户的计算机上后,您将面临一个更大的问题——没有项目目录。一个简单的解决方案是将.xml文件复制到与.exe文件相同的目录中,这样您就永远不会找不到它了。或者将其作为真正的资源嵌入。项目+属性,资源选项卡。 - Hans Passant
@HansPassant,有没有办法将库的“非dll”依赖项包含到主机项目中,以便这些依赖项(例如文本文件)可以在不重新编译库的情况下更改。(如果是嵌入式资源,则需要重新编译库以更改(txt)文件) - ANewGuyInTown
@ANewGuyInTown,这里有一个潜在的解决方案,可以在dll中嵌入一个默认文件,并使用它来创建一个磁盘上的文件(如果不存在)。然后从用户可以编辑的磁盘文件中加载。如果从程序文件目录(exe位置)加载,则可能需要管理员权限,因此可以查找标准应用程序数据目录。 - Wilco
1个回答

5

在StackOverflow上有一些关于此的文章,但是这里有一些简要的注释和代码...

  1. Make sure you mark the file as an "Embedded Resource" in the properties under Build Action.
  2. I am using some code to read html files from a DLL and this is roughly how I get it into a string. Gives you the general idea I hope.

        foreach (string resource in Assembly.GetExecutingAssembly().GetManifestResourceNames())
        {
            if (resource.EndsWith("Snippet.htm"))
            {
                Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
                byte[] buff = new byte[s.Length];
                s.Read(buff, 0, buff.Length);
    
                string snippet = Encoding.UTF8.GetString(buff);
            }
        }
    

1
你如何在没有创建嵌入式资源的情况下实现?换句话说,如何使文件更改而不需要重新编译 DLL。 - ANewGuyInTown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接