ILMerge参考文章
https://www.bbsmax.com/A/gAJGlAn05Z/
https://blog.youkuaiyun.com/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没错。
请说一下原因,谢谢。

----------------------------------------------------------------------------------------------
评论答复:
表友善的回复…发表回复

Poopaye 2015-05-06
通常情况下引用只保存了名称,版本等信息,加载时是通过名称去查找dll的,你改了名字默认就找不到了 如果需要自定义引用文件名,你需要手动编辑程序的配置: https://msdn.microsoft.com/en-us/library/1xtk877y%28v=vs.110%29.aspx

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加入了防止修改名字的代码

Vincent_Wang_789 2015-05-06
引用 1 楼 Saleayas 的回复:
编译会出错吗?
我估计只在运行时出错,因为程序集的名字和文件名是不同的。
你好,
编译不报错,就是运行出错。


於黾 2015-05-06
sln引用m2.dll的时候,把c.dll和d.dll放进去了吗? 如果你放的还是a和b,当然会找不到引用

Saleayas 2015-05-06
编译会出错吗? 我估计只在运行时出错,因为程序集的名字和文件名是不同的。

tcmakebest 2015-05-06
偷梁换柱的话,必须用新编译的DLL同名覆盖原来的DLL吧. 间接引用DLL的话,感觉需要把所有项目归到一个解决方案中,才能自动匹配到, 否则只能单独添加缺少的DLL文件到新的运行目录.

Vincent_Wang_789 2015-05-06
各位,刚才俄罗斯老外回复我

看来只能研究一下ILMerge了

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之类的代码。

Vincent_Wang_789 2015-05-06
各位,我重新画了一个图,或许更清晰些。
刚才测试还发现一个问题,就是用A.dll B.dll生成了M1.dll,我修改了一下程序集名称为M3,就生成了M3.dll。
测试M3.dll依旧报错。
是不是程序里面加了反射之类的,会检测dll名字是否被修改。
