我正在尝试构建一个依赖于几个托管C ++程序集的VS 2005网站项目。其中一个托管C ++程序集依赖于(静态加载)非托管DLL,它使用__declspec(dllexport)来导出类。
出于某种原因,我收到以下构建错误:
Error 4 The specified module could not be found. (Exception from HRESULT: 0x8007007E)
(来自构建输出详细信息):
(0): Build (web): The specified module could not be found. (Exception from HRESULT: 0x8007007E)
当我在网站的\ Bin \目录中使用非托管DLL构建时,但不在路径中。如果我将非托管DLL放在路径中,然后重新启动visual studio,它就会构建并运行得很好。
注意:这个帖子似乎有关系,但我还没有达到部署的目的:Unmanaged DLLs fail to load on ASP.NET server
有没有办法让这个.sln在\ Bin \而不是路径中正确构建非托管DLL? (我真的更愿意将这些作为网站的一部分,而不是系统)
编辑: 在某种程度上,我似乎误解了\ Bin \文件夹的用途。除了托管程序集应该去那里之外什么都不是。 (因此,我所依赖的COM对象和其他非托管DLL可能属于其他地方。)
答案 0 :(得分:1)
我相信ASP.NET会相当多地复制你的程序集,以避免锁定原始DLL(这会阻止使用较新版本进行覆盖)。然后,当您覆盖它时,它需要旧版本的副本,直到所有未完成的请求完成,同时新版本用于新请求。
总之,您的DLL不会从您放置它的\bin\
目录运行,它会查找实际运行的本地依赖项。
您的选择是将本机DLL放在路径中,或者根据需要添加代码以将它们显式复制到“真实”程序集目录。但是你的代码甚至不应该有权写入文件系统,所以我认为你被困在路径上了。
但请注意,您可以将目录添加到应用程序自己的环境中,而不会影响全局路径。例如,p / invoke SetDllDirectory
不要添加\bin\
。将您的原生DLL放在单独的目录中,如\bin\native
或\bin\x86
,因此当您更改搜索路径时,不会更改找到的托管DLL。
编辑: 这仅在托管DLL延迟加载其链接的任何非托管本机DLL(使用/ DELAYLOAD)时才有效。否则,global.asax(或路径设置发生的任何地方)的编译将失败。