18

我正在通过 API 为另一个应用程序编写插件。插件分布在 DLL 中。是否可以在 DLL 文件中嵌入其他文件,如 pdf、图像、chm 帮助文件等...我希望能够为我的插件提供文档,但我仍然希望保留分发插件的能力-作为单个文件,用户只需拖放到应用程序上即可安装。

4

5 回答 5

13

当然,您可以在 DLL 中嵌入资源。然后在运行时,您只需执行以下操作:

Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("com.stackoverflow.plugin.example.Foo.pdf");

这将为您提供Foo.pdf嵌入在 DLL 中的文件的流。请注意,资源名称必须由您从中调用方法的类型的名称空间限定范围。

于 2009-12-11T20:33:25.217 回答
9

当然,只需在 VS.NET 中将它们设为“嵌入式资源”(假设您正在使用它)。然后,您可以通过资源 API 或简单地使用Assembly.GetManifestResourceStream()来读取它们。

于 2009-12-11T20:34:03.467 回答
1

是的,你可以这么做。

将资源文件添加到您的项目中。在 Visual Studio 中打开资源文件,然后单击“插入资源”。您可以选择不同类型的资源,包括外部文件。

Visual Studio 将为您生成代码,以便您可以在运行时通过Resources标识符从文件名中检索文件作为字节数组。

于 2009-12-11T20:33:18.817 回答
0

作为替代选项,如果您需要在用户机器上解压缩并保存文件(比如您希望在应用程序外部访问的 chm 文件),您也可以对 zip 文件执行相同操作。

您说您希望将文件“拖动”到您的应用程序中。只需让您的 DDE 事件检查文件是否为 zip 文件(甚至可能使用带有元数据的 jar 之类的东西)并解压缩必要的文件,包括实际的插件。

这与 openxml 文档的想法相同,它们实际上只是变相的拉链。

于 2009-12-11T21:04:04.260 回答
0
string htmlBody = "";
string assemblyActualPath = Assembly.GetExecutingAssembly().Location; // C:\MyProyect\bin\Debug\MyAssembly.exe
string assemblyActualDirectory = Path.GetDirectoryName(assemblyActualPath); // C:\MyProyect\bin\Debug\
string assemblyPath = Path.Combine(assemblyActualDirectory, "Library.dll"); // C:\MyProyect\bin\Debug\Library.dll
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Stream stream = assembly.GetManifestResourceStream("LibraryNameSpace.Templates.Html.HTMLPage1.html");
using (StreamReader reader = new StreamReader(stream))
{
     htmlBody = reader.ReadToEnd();
}

嵌入式资源在哪里HTMLPage1.html,并且具有“不在输出目录中复制”属性

于 2022-01-07T21:15:03.620 回答