我正在通过 API 为另一个应用程序编写插件。插件分布在 DLL 中。是否可以在 DLL 文件中嵌入其他文件,如 pdf、图像、chm 帮助文件等...我希望能够为我的插件提供文档,但我仍然希望保留分发插件的能力-作为单个文件,用户只需拖放到应用程序上即可安装。
5 回答
当然,您可以在 DLL 中嵌入资源。然后在运行时,您只需执行以下操作:
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("com.stackoverflow.plugin.example.Foo.pdf");
这将为您提供Foo.pdf
嵌入在 DLL 中的文件的流。请注意,资源名称必须由您从中调用方法的类型的名称空间限定范围。
当然,只需在 VS.NET 中将它们设为“嵌入式资源”(假设您正在使用它)。然后,您可以通过资源 API 或简单地使用Assembly.GetManifestResourceStream()来读取它们。
是的,你可以这么做。
将资源文件添加到您的项目中。在 Visual Studio 中打开资源文件,然后单击“插入资源”。您可以选择不同类型的资源,包括外部文件。
Visual Studio 将为您生成代码,以便您可以在运行时通过Resources
标识符从文件名中检索文件作为字节数组。
作为替代选项,如果您需要在用户机器上解压缩并保存文件(比如您希望在应用程序外部访问的 chm 文件),您也可以对 zip 文件执行相同操作。
您说您希望将文件“拖动”到您的应用程序中。只需让您的 DDE 事件检查文件是否为 zip 文件(甚至可能使用带有元数据的 jar 之类的东西)并解压缩必要的文件,包括实际的插件。
这与 openxml 文档的想法相同,它们实际上只是变相的拉链。
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
,并且具有“不在输出目录中复制”属性