如何将一个非托管 DLL 和一个托管程序集合并为一个文件?

7
来自PHX Software的SQLite已经将托管程序集(System.Data.SQLite)和非托管dll(SQLite 32位或64位dll)合并为一个文件,并成功地将它们链接在一起。
我该怎么做呢?我需要将托管程序集嵌入到非托管dll中,还是反过来?
也就是说,我的问题如下:
1.我需要按什么顺序进行操作? 2.我需要哪些工具或知识才能完成此操作? 3.我在托管代码中如何链接到非托管dll中导出的函数(如果不同)?
我问这个问题的原因是我想构建一个托管的zLib包装器。我知道.NET中有托管类,但从经验来看,它们有点受限制(并且它们没有做好缓冲),所以我想创建自己的副本,也因为我想学习如何实现这个。
那么,有谁知道我需要做什么和如何做吗?
我找到了以下内容:
1.如何将几个托管和非托管DLL合并成一个单独的DLL? 2.示例:混合非托管C++、C++/CLI和C#代码 我将尝试这样做,但如果有其他可用的附加信息,那就更好了。

在这样做之前三思,特别是对于你的“核心”程序集。如果这不是你代码的基本特征,最好使这些程序集动态加载。否则,任何使用这种程序集的人都必须采取一些额外的步骤来确保它使用正确的版本(x86 vs x64),即使他没有使用你的非托管代码。这对于System.Data.SQLite的例子(基本特征)是合理的,但在你的情况下可能不合理。 - SergGr
2个回答

0

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

它可以合并托管和非托管程序集。

微软似乎也对在here使用它有一些话要说。


1
这个 Microsoft 的链接完全不相关。 - vidstige

0

你尝试过在 System.Data.SQLite 上运行反编译器看看他们是怎么做的吗?

我想你可以:

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

但是因为zlib是用C语言编写的,所以您还可以使用zlib源代码在C++实现的CLR程序集中包装所需的调用。但是我不确定在这种情况下如何处理位数。


这是可能的,并且处理32位和64位情况。不过,在sqlite中并不是这样做的。 - vidstige

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接