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

如何将非托管dll和托管程序集合并到一个文件中?,dll,assemblies,embed,unmanaged,managed,Dll,Assemblies,Embed,Unmanaged,Managed,来自的SQLite已将托管程序集(System.Data.SQLite)与非托管dll(SQLite 32位或64位dll)组合到一个文件中,并设法将它们链接在一起 我该怎么做?我是否需要将托管程序集嵌入非托管dll,或者反之亦然 我的问题是: 我需要按什么顺序做这件事 为了做到这一点,我需要什么工具或知识 如何(如果不同)链接到托管代码中非托管dll中导出的函数 我问这个问题的原因是我想构建一个托管zLib包装器。我知道.NET中有托管类,但根据经验,它们有点有限(而且有点愚蠢,因为它们没有进

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

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

我的问题是:

  • 我需要按什么顺序做这件事
  • 为了做到这一点,我需要什么工具或知识
  • 如何(如果不同)链接到托管代码中非托管dll中导出的函数
  • 我问这个问题的原因是我想构建一个托管zLib包装器。我知道.NET中有托管类,但根据经验,它们有点有限(而且有点愚蠢,因为它们没有进行适当的缓冲),所以我想创建自己的副本,也是因为我想学习如何做到这一点

    那么,有人知道我需要做什么以及如何做吗

    我发现了以下几点:


    我打算试试这个,但是任何可用的附加信息都会很好。

    您是否尝试在System.Data.SQLite上运行reflector以查看他们是如何做到的

    我想你可以:

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

    不过,因为ZLIB在C中,所以您也可以使用ZLIB源来封装C++实现的CLR程序中所需的调用。 但我不确定在这种情况下,您将如何处理咬伤。

    从中查找mergebin应该是您要查找的内容

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


    MS似乎也有话要说,在使用它之前要三思而后行,尤其是在使用“核心”程序集时。如果这不是代码的基本特性,则最好动态加载此类程序集。在另一种情况下,使用这种程序集的任何人都必须执行一些额外的步骤,以确保它使用正确的版本(x86 vs x64),即使他没有使用任何非托管代码。对于您来说,
    System.Data.SQLite
    (基本功能)的示例是合理的,但在您的情况下可能不合理。这是可能的,并且可以处理32位和64位的情况。但在sqlite中并不是这样的,微软的链接是完全不相关的。