最新消息:20210917 已从crifan.com换到crifan.org

【已解决】C#项目Clean出错:Error 1 Resource ‘Interop_SHDocVw’ could not be loaded because the file to which it is linked could not be found

C# crifan 2576浏览 0评论

【问题】

对于一个C#项目:下载Songtaste歌曲 ,之前折腾了,将dll整合到exe中,貌似OK了。

但后来关闭后重新打开项目,编译出错:

【已解决】C#项目编译出错:TlbImp : error TI0000: System.UnauthorizedAccessException – Access to the path xxx is denied. Microsoft.Common.targets: warning MSB3283: Cannot find wrapper assembly for type library "SHDocVw".

然后也解决了。

结果,再去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

resource could not be loaded

 

【解决过程】

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:

add dll to prj dir

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

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
92 queries in 0.185 seconds, using 23.38MB memory