如何将非托管 dll 和托管程序集合并到一个文件中?

Posted

技术标签:

【中文标题】如何将非托管 dll 和托管程序集合并到一个文件中?【英文标题】:How do I combine an unmanaged dll and a managed assembly into one file? 【发布时间】:2011-02-12 20:34:50 【问题描述】:

PHX Software 的 SQLite 将托管程序集 (System.Data.SQLite) 与非托管 dll(SQLite 32 位或 64 位 dll)组合到一个文件中,并设法将它们链接在一起。

我该怎么做?我是否需要将托管程序集嵌入到非托管 dll 中,反之亦然?

即。我的问题是:

    我需要按什么顺序执行此操作? 我需要哪些工具或知识才能做到这一点? 如何(如果不同)从托管代码中的非托管 dll 链接到导出的函数?

我问这个的原因是我想构建一个托管的 zLib 包装器。我知道 .NET 中有托管类,但从经验来看,它们有点有限(而且有点愚蠢,因为它们没有进行适当的缓冲),所以我想创建自己的副本,也是因为我想学习如何做到这一点。

那么有人知道我需要做什么以及怎么做吗?

我发现了以下内容:

How to merge several managed and unmanaged DLLs into a single DLL? Sample: Mixing Unmanaged C++, C++/CLI, and C# code

我会试试这个,但任何可用的其他信息也很好。

【问题讨论】:

在执行此操作之前要三思而后行,尤其是对于您的“核心”程序集。如果这不是您的代码的基本功能,最好使此类程序集动态加载。在其他情况下,任何使用此类程序集的人都必须执行一些额外的步骤以确保它使用正确的版本(x86 与 x64),即使他没有使用您的任何非托管代码。 System.Data.SQLite (基本功能)的示例对您来说是合理的,但在您的情况下可能不合理。 【参考方案1】:

您是否尝试过在 System.Data.SQLite 上运行反射器,看看他们是如何做到的?

我想你可以:

将 32 位和 64 位 dll 作为资源包含在托管程序集中 根据位数提取正确的到某处 如有必要,通过 PInvoke 调用 SetDllDirectory(),以便 windows 可以找到提取的 dll 实例化一个 32 位或 64 位托管包装类,该类具有对 dll 的引用

但是,由于 zlib 使用 C 语言,您还可以使用 zlib 源将所需的调用包装在 C++ 实现的 CLR 程序集中。 但我不确定在这种情况下你会如何处理比特。

【讨论】:

这是可能的,并且可以处理 32 位和 64 位的情况。这不是它在 sqlite 中的完成方式。【参考方案2】:

从sqlite 查找mergebin,它应该是你要找的。

它可以将托管和非托管程序集合并到一起。

MS 似乎对使用它也有话要说here

【讨论】:

微软链接完全不相关。

以上是关于如何将非托管 dll 和托管程序集合并到一个文件中?的主要内容,如果未能解决你的问题,请参考以下文章

将非托管 DLL 部署到输出目录

将非托管 C++ dll 添加到托管 C++ dll

将非托管 dll 的 Delphi 代码转换为 C#

从非托管 dll 文件(注入到正在运行的进程中)调用托管 dll

如何将非托管库引用添加到 NUnit 测试

从非托管 DLL 导入函数时,0x8007007F 是啥意思?