【问题标题】:VS 2005, website project: managed C++ assemblies require dependencies in path, not bin dir?VS 2005,网站项目:托管 C++ 程序集需要路径中的依赖项,而不是 bin 目录?
【发布时间】:2012-02-19 19:18:01
【问题描述】:

我正在尝试构建一个依赖于多个托管 C++ 程序集的 VS 2005 网站项目。托管 C++ 程序集之一依赖于(静态加载)非托管 DLL,该 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

有没有什么方法可以用 \Bin\ 中的非托管 DLL 而不是路径来正确构建这个 .sln? (我真的更愿意将这些作为网站的一部分,而不是系统)

编辑: 看来我在某种程度上误解了 \Bin\ 文件夹的用途。听起来除了托管程序集之外什么都没有。 (所以我一直放在那里的 COM 对象和它们所依赖的其他非托管 DLL 可能属于其他地方。)

【问题讨论】:

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


    【解决方案1】:

    我相信 ASP.NET 会大量复制您的程序集,以避免锁定原始 DLL(这将防止被更新版本覆盖)。然后,当您覆盖它时,它需要旧版本的副本,直到所有未完成的请求完成,以及用于新请求的新版本。

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

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

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

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

    【讨论】:

    • 很好,如何将目录添加到 IIS5 或 IIS6 路径? (或者我只是用我需要的路径创建一个自定义用户配置文件?) C:\inetpub\wwwroot\\bin\ 似乎是添加到 IIS 路径的一个非常明显的东西......(另请注意:csc. exe 似乎有一个 /linkresource 指令,但到目前为止我没有运气。)
    • 不要添加包含托管程序集的bin 目录,这将干扰 ASP.NET 程序集版本控制系统。请为非托管 DLL 使用子目录。在使用 C++/CLI 程序集之前,您是否可以从 ASP.NET 代码隐藏页面处理 WebApplication_Load 事件?
    • 我当然不希望有页面事件。将此程序集放入 IIS 网站会杀死整个网站,即使只有一个页面可以访问它。
    • "要在 Web 应用程序首次启动时执行代码,我们需要创建一个名为 Global.asax 的特殊文件。该文件可以包含应用程序级、会话级和请求级事件的事件处理程序,在这里我们可以添加应用程序启动时将执行的代码。” -- 来自asp.net/web-forms/tutorials/data-access/caching-data/…
    • global.asax 必须在每次更改时进行编译。此错误发生在编译期间。 (如果我将文件移动到路径以通过编译,然后从不更改文件,它会起作用,但如果 global.asax 曾经更改过,然后 iisreset 事情就会中断。)
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2016-12-12
    相关资源
    最近更新 更多