ILMerge参考文章
https://www.bbsmax.com/A/gAJGlAn05Z/
https://blog.csdn.net/wpwalter/article/details/100156665/
https://www.cnblogs.com/cogito/p/it_tools04.html
Vincent_Wang_7892015-05-06 09:54:14
C#编译环境下
如图所示,A.dll和B.dll没有源代码,他们被M.sln引用,然后编译生成M1.dll。
由于某些原因,我想把A.dll和B.dll的名字换掉,用C.dll和D.dll,然后被M.sln引用,编译没有报错,顺利生成M2.dll。
但是在另一个新sln里面引用M2.Dll时,代码编译出错。引用M1.dll没错。
请说一下原因,谢谢。
![](https://img-blog.csdnimg.cn/img_convert/ac3280b4aa49476493f81b9bc7ceea9f.png)
----------------------------------------------------------------------------------------------
评论答复:
表友善的回复…发表回复
![](https://img-blog.csdnimg.cn/img_convert/a3ee39e331228a8724d61208312a84a2.png)
Poopaye 2015-05-06
通常情况下引用只保存了名称,版本等信息,加载时是通过名称去查找dll的,你改了名字默认就找不到了 如果需要自定义引用文件名,你需要手动编辑程序的配置: https://msdn.microsoft.com/en-us/library/1xtk877y%28v=vs.110%29.aspx
![](https://img-blog.csdnimg.cn/img_convert/17c349caac2ef00fa81b1efabbc7988f.png)
Vincent_Wang_789 2015-05-06
引用 2 楼 Z65443344 的回复:
sln引用m2.dll的时候,把c.dll和d.dll放进去了吗? 如果你放的还是a和b,当然会找不到引用
是的,放的是c.dll, d.dll 我现在怀疑,是不是dll改了名字后,再引用,会对程序有影响。 要么就是原来的a.dll和b.dll加入了防止修改名字的代码
![](https://img-blog.csdnimg.cn/img_convert/6eac0a4a5696a5e923a2b1619034c3b0.png)
Vincent_Wang_789 2015-05-06
引用 1 楼 Saleayas 的回复:
编译会出错吗?
我估计只在运行时出错,因为程序集的名字和文件名是不同的。
你好,
编译不报错,就是运行出错。
![](https://img-blog.csdnimg.cn/img_convert/002255d2cf1b44e1d7a04d65d08ccc4a.png)
![](https://img-blog.csdnimg.cn/img_convert/8a7bd4c008ac4b3b682ee376a8b9c150.png)
於黾 2015-05-06
sln引用m2.dll的时候,把c.dll和d.dll放进去了吗? 如果你放的还是a和b,当然会找不到引用
![](https://img-blog.csdnimg.cn/img_convert/e6da6546fb331ef28b9fa5640d58496f.jpeg)
Saleayas 2015-05-06
编译会出错吗? 我估计只在运行时出错,因为程序集的名字和文件名是不同的。
![](https://img-blog.csdnimg.cn/img_convert/18af634c2bcc4f93e7f26e58b9e28ff8.png)
tcmakebest 2015-05-06
偷梁换柱的话,必须用新编译的DLL同名覆盖原来的DLL吧. 间接引用DLL的话,感觉需要把所有项目归到一个解决方案中,才能自动匹配到, 否则只能单独添加缺少的DLL文件到新的运行目录.
![](https://img-blog.csdnimg.cn/img_convert/bb55a3381b5fa05b3b0697e21b087d4c.png)
Vincent_Wang_789 2015-05-06
各位,刚才俄罗斯老外回复我
![](https://img-blog.csdnimg.cn/img_convert/acf0c9ab60683a86c8c7a7b53c93a775.png)
看来只能研究一下ILMerge了
![](https://img-blog.csdnimg.cn/img_convert/6f783d30a3705fe3fb30feb630b5b914.png)
Vincent_Wang_789 2015-05-06
引用 5 楼 shingoscar 的回复:
通常情况下引用只保存了名称,版本等信息,加载时是通过名称去查找dll的,你改了名字默认就找不到了 如果需要自定义引用文件名,你需要手动编辑程序的配置: https://msdn.microsoft.com/en-us/library/1xtk877y%28v=vs.110%29.aspx
貌似这个程序只是引用了dll,没有动态加载dll的load之类的代码。
![](https://img-blog.csdnimg.cn/img_convert/33d773236c2f35ac0147648beead43c0.png)
Vincent_Wang_789 2015-05-06
各位,我重新画了一个图,或许更清晰些。
刚才测试还发现一个问题,就是用A.dll B.dll生成了M1.dll,我修改了一下程序集名称为M3,就生成了M3.dll。
测试M3.dll依旧报错。
是不是程序里面加了反射之类的,会检测dll名字是否被修改。
![](https://img-blog.csdnimg.cn/img_convert/5b73a4b1dc4c6956ad92cacde340068f.png)