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没错。 请说一下原因,谢谢。 |
|
20分 |
编译会出错吗?
我估计只在运行时出错,因为程序集的名字和文件名是不同的。 |
10分 |
sln引用m2.dll的时候,把c.dll和d.dll放进去了吗?
如果你放的还是a和b,当然会找不到引用 |
你好, |
|
是的,放的是c.dll, d.dll 我现在怀疑,是不是dll改了名字后,再引用,会对程序有影响。 要么就是原来的a.dll和b.dll加入了防止修改名字的代码 |
|
5分 |
通常情况下引用只保存了名称,版本等信息,加载时是通过名称去查找dll的,你改了名字默认就找不到了
如果需要自定义引用文件名,你需要手动编辑程序的配置: https://msdn.microsoft.com/en-us/library/1xtk877y%28v=vs.110%29.aspx |
各位,我重新画了一个图,或许更清晰些。
刚才测试还发现一个问题,就是用A.dll B.dll生成了M1.dll,我修改了一下程序集名称为M3,就生成了M3.dll。 测试M3.dll依旧报错。 是不是程序里面加了反射之类的,会检测dll名字是否被修改。 |
|
貌似这个程序只是引用了dll,没有动态加载dll的load之类的代码。 |
|
各位,刚才俄罗斯老外回复我
看来只能研究一下ILMerge了 |
|
5分 |
偷梁换柱的话,必须用新编译的DLL同名覆盖原来的DLL吧.
间接引用DLL的话,感觉需要把所有项目归到一个解决方案中,才能自动匹配到, 否则只能单独添加缺少的DLL文件到新的运行目录. |