最近做了一个数据成图组件,是对一个com控件的二次开发。
该com控件是个窗体控件在使用过程中自动生成了以AxInterop开头的AxInterop.****.dll和以Interop.开头的Interop.****.dll两个中间类,而这两个类放置的位置必须与最终的窗体同目录。
我开发的.net组件名称为:DCGjogis.dll,假设调用该组件生成的windows窗体程序为AAA.exe,要求AAA.exe与DCGjogis.dll同目录,因此结果就是,该目录下包含4个文件,分别为:AAA.exe,DCGjogis.dll,AxInterop.****.dll,Interop.****.dll
而要求是该目录下只能包含AAA.exe,DCGjogis.dll两个文件,剩余的AxInterop.****.dll,Interop.****.dll两个文件必须放置在指定的文件夹中。
为了解决这个问题,研究了好久,都没有什么好的办法,后来终于找到一个取巧的办法,就是使用ILMerge合并dll类库。
1、下载并安装ILMerge.exe
2、我的安装目录是:D:\Program Files (x86)\ILMerge,然后在cmd命令中,进入该目录
3、在该目录下运行ILMerge.exe命令,我的命令是:
ILMerge.exe /ndebug /target:library /out:DCGjogis.dll DLL/DCGjogis.dll /log DLL/AxInterop.****.dll DLL/Interop.****..dll
/target 是输出类型;/out是输出dll类名称;/log是要合并的dll类名称,由于我的其它类是放置在“DLL”目录下,因此带有路径。
注意:
1、原始DCGjogis.dll自身包含其它引用类,都需要放置在与原始DCGjogis.dll相同的目录下。
2、如果原始DCGjogis.dll自身包含其它引用类,而其它引用类是相对路径的话,那么其它引用类每次更新,合并DCGjogis.dll都需要重新合并制作。
通过合并,最终实现了AAA.exe,DCGjogis.dll同目录,即可运行。