求教如何将.net程序集和本地dll合并为一个文件

guojivip0420 2014-04-21 10:44:12
小弟最近做的一个项目中有一个xxx.dll引用了System.Data.SQLite.dll和NPOI.dll这两个程序集,考虑在部署的时候方便想将System.Data.SQLite.dll和NPOI.dll与这个xxx.dll合并。

使用ILMerge进行合并时报错经过查看发现问题出在System.Data.SQLite.dll身上,主要原因是System.Data.SQLite.dll引用了非托管C++的代码,System.Data.SQLite提供的两种编译模式dll我也都试过了均无法进行合并 (具体解释这两种编译模式的文章:http://jamesfancy.blog.51cto.com/2516291/1357462) ,而后又尝试使用.NET Reactor 进行合并,合并执行是成功了,但是合并后的dll无法正常工作,同样问题出System.Data.SQLite对非托管代码的调用上,想求教各位如何才能成功将System.Data.SQLite.dll与我的程序集进行合并?同时想到如果我自己的程序集需要对另一个C++dll的导出函数进行调用又该如何合并这两个dll文件呢?
另外想求教高手System.Data.SQLite是如何做到将非托管代码嵌入到托管代码中最终只形成一个文件的呢?
多谢各位!
...全文
4715 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2014-05-21
  • 打赏
  • 举报
回复
个人觉得,记着某个程序集引用了哪些程序集 是很必要的。
CGabriel 2014-05-21
  • 打赏
  • 举报
回复
把 System.Data.SQLite.dll 和 NPOI.dll 反编译了,然后把代码 copy 到自己的代码里面。 重新编译。。
guojivip0420 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
不知道你为什么要合并。之前有人问过类似的问题。 他的动机是因为他要部署一个Windows商店应用,而这种类型的应用不支持原生dll,所以他考虑合并。 但是这只是表象,问题的实质是,原生dll是基于x86机器码的,和基于ARM的Windows RT设备不兼容,就算可以合并,也不能运行。如果你的动机和他类似,那么你也没有必要尝试了。
在这个项目中与sqlite和npoi打交道的只有这个dll,为了部署或者程序集复用的时候方便不需要总得记着这个程序集引用了system.data.sqlite.dll和npoi.dll要一起拷贝这两个文件,所以考虑合并。同时在这个项目中也不用考虑x64和x86的问题, system.data.sqlite提供了x64和x86的版本,我只需要使用只有system.data.sqlite.dll这一个文件的那个版本就可以,不需要使用含有SQLite.Interop.dll文件的版本,最终的项目也只是跑在x86平台上。总体而言,1、这个项目基本只跑在x86平台,如果能够成功合并,可以提供合并后的x86和x64版本;2、是为了部署方便;3、在合并的时候才发现存在这个问题,所以想到如果以后自己的程序集中调用了C++dll的导出函数该如何合并,因为自己的工作中经常会用到这样的调用方式,所以想了解这方面的知识。感谢版主回帖望指点~
threenewbee 2014-04-21
  • 打赏
  • 举报
回复
不知道你为什么要合并。之前有人问过类似的问题。 他的动机是因为他要部署一个Windows商店应用,而这种类型的应用不支持原生dll,所以他考虑合并。 但是这只是表象,问题的实质是,原生dll是基于x86机器码的,和基于ARM的Windows RT设备不兼容,就算可以合并,也不能运行。如果你的动机和他类似,那么你也没有必要尝试了。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧