VS 2005,网站项目:托管C ++程序集需要路径中的依赖项,而不是bin目录?

时间:2012-01-26 17:29:34

标签: asp.net c++-cli dllimport

我正在尝试构建一个依赖于几个托管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可能属于其他地方。)

1 个答案:

答案 0 :(得分:1)

我相信ASP.NET会相当多地复制你的程序集,以避免锁定原始DLL(这会阻止使用较新版本进行覆盖)。然后,当您覆盖它时,它需要旧版本的副本,直到所有未完成的请求完成,同时新版本用于新请求。

总之,您的DLL不会从您放置它的\bin\目录运行,它会查找实际运行的本地依赖项。

您的选择是将本机DLL放在路径中,或者根据需要添加代码以将它们显式复制到“真实”程序集目录。但是你的代码甚至不应该有权写入文件系统,所以我认为你被困在路径上了。

但请注意,您可以将目录添加到应用程序自己的环境中,而不会影响全局路径。例如,p / invoke SetDllDirectory不要添加\bin\。将您的原生DLL放在单独的目录中,如\bin\native\bin\x86,因此当您更改搜索路径时,不会更改找到的托管DLL。

编辑:   这仅在托管DLL延迟加载其链接的任何非托管本机DLL(使用/ DELAYLOAD)时才有效。否则,global.asax(或路径设置发生的任何地方)的编译将失败。