我可以在 DLL 中嵌入其他文件吗?

Posted

技术标签:

【中文标题】我可以在 DLL 中嵌入其他文件吗?【英文标题】:Can I embed other files in a DLL? 【发布时间】:2010-12-25 19:55:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

是的,你可以这样做。

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

如果您不确定文件名 Foo.pdf 前面应该是什么命名空间。在调试中运行它,string[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于我可以在 DLL 中嵌入其他文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

在已编译的可执行文件中嵌入 DLL

在可执行文件中使用嵌入式 .dll

C#将引用的dll嵌入到exe文件中

使用 AppDomain 将 DLL 作为嵌入式资源文件加载

dll文件可以修改里面的函数吗?

在本机 DLL 中嵌入多个同名资源 (RC) 文件