【问题】
对于一个C#项目:下载Songtaste歌曲 ,之前折腾了,将dll整合到exe中,貌似OK了。
但后来关闭后重新打开项目,编译出错:
然后也解决了。
结果,再去clean项目时,又出错了:
Error 1 Resource ‘Interop_SHDocVw’ could not be loaded because the file to which it is linked could not be found: D:\tmp\tmp_dev_root\downloadSongtasteMusic\downloadSongtasteMusic\downloadSongtasteMusic\obj\x86\Debug\Interop.SHDocVw.dll. D:\tmp\tmp_dev_root\downloadSongtasteMusic\downloadSongtasteMusic\downloadSongtasteMusic\Properties\Resources.resx 0
【解决过程】
1.很明显,此处执行Clean,会去删除debug目录下面的所有文件,包括Interop.SHDocVw.dll。
Interop.SHDocVw.dll是在添加COM引用“Microsoft Internet Controls”(当前是x64系统,其对应的是C:\Windows\SysWOW64\ieframe.dll)
时自动添加到obj\x86\Debug\文件夹下面的。
而我之前为了集成此dll到exe中,将Interop.SHDocVw.dll添加到项目的资源中了。
所以此处clean删除了Interop.SHDocVw.dll,系统会提示无法加载资源文件了。
2.所以,那就像,是不是换个方式,不用Interop.SHDocVw.dll,而是去用C:\Windows\SysWOW64\ieframe.dll,(32位系统对应的是C:\Windows\system32\ieframe.dll),看看是否可行。
然后就去看了看对应的ieframe.dll,结果却发现,很不方便直接集成此文件,因为:
- 当前ieframe.dll有两个版本,一个是32位的,一个64位的
- 并且本身dll文件都非常大:
- 64位:C:\Windows\SysWOW64\ieframe.dll,大小是9.28MB
- 32位:C:\Windows\System32\ieframe.dll,大小是10.4MB
所以,基本上就不用考虑集成此dll了,毕竟我的exe只有64K,如果集成了10M,20M的大小,也忒变态了。
3.所以还是考虑集成Interop.SHDocVw.dll吧。然后想到了,先把此编译(生成)出来的obj\x86\Debug\下面的Interop.SHDocVw.dll,拷贝到别的地方,比如项目主目录下面,避免clean时被删。,然后再当做资源文件添加进来。
这样也许也可以实现集成的效果。
所以就去把dll拷贝到项目根目录,然后把dll当做资源添加进来,再设置为 Embdded resource:
4.再去编译看看效果。
然后正常编译和clean,就都正常。
剩下的,还要去等有空换个其他环境,
比如:
- x86的xp
- 别的x64的win7
等环境去都测试一把,才能验证此法是否真正可以工作的。
【总结】
C#项目clean时出现:
Error 1 Resource ‘Interop_SHDocVw’ could not be loaded because the file to which it is linked could not be found
的原因是,当前项目中添加的资源文件Interop.SHDocVw.dll,是放在项目输出目录中的:
obj\x86\Debug\Interop.SHDocVw.dll
所以clean时会被删除掉,所以会报错,找不到资源文件Interop.SHDocVw.dll了。
解决办法是:
把相关的资源文件(Interop.SHDocVw.dll)拷贝到别的地方,比如项目的根目录,保证不是项目的编译生成的目录即可,这样clean时就不会被删除了,就不会出现这错误了。
转载请注明:在路上 » 【已解决】C#项目Clean出错:Error 1 Resource ‘Interop_SHDocVw’ could not be loaded because the file to which it is linked could not be found