【问题标题】:32bit dll not loading with Enable32Mode on IIS 7.5在 IIS 7.5 上未使用 Enable32Mode 加载 32 位 dll
【发布时间】:2011-06-12 08:30:46
【问题描述】:

我有一个引用 32 位 DLL 的 MVC 3 网站。操作系统是 Windows 2008 R2 x64。该网站位于 ASP.NET 4 应用程序池中。我打开了 Enable32Bit 但它不起作用。我收到错误图像异常,但无法找到在 IIS 中打开此级别的登录。我已经设置了一个页面,输出它是运行 32 位还是 64 位,当我打开/关闭 AppPool 上的 Enable32Bit 时,我得到了正确的输出。该网站也是完全信任的。

我不知道如何让它发挥作用。我知道它适用于Win7 32bit。

你能建议一些尝试吗?

更新:我刚刚编写了一个简单的 Windows 窗体应用程序,上面有一个调用我的 DLL 的按钮。这是以 x86 为目标构建的,并且运行良好,因此我认为 IIS 或 ASP.Net 存在问题。以下是用于引用 DLL 的代码:

        [DllImport("CDCrypt.dll")]
        [return: MarshalAs(UnmanagedType.LPStr)]
        public static extern String Encrypt([MarshalAs(UnmanagedType.LPStr)] String aName);



        [DllImport("CDCrypt.dll")]
        [return: MarshalAs(UnmanagedType.LPStr)]
        public static extern String Decrypt([MarshalAs(UnmanagedType.LPStr)] String aName);

更新 2: ASP.Net 管道是 Clasic 还是 Integrated 是否重要?我都试过了,但同样的问题,但认为值得一问

更新 3:我发现这个 question 试图做同样的事情,但他放弃了,这没什么帮助!!

【问题讨论】:

  • 这个 32 位 DLL 是完全独立的,还是有其他依赖?您是否尝试过运行 Process Monitor 以查看它还可能尝试加载什么?
  • 独立的 DLL 非常非常不可能。即使它非常简单,它也会依赖于 Microsoft C 运行时库 DLL。
  • 它是用 Delphi 编写的。查看我更新的问题
  • 进程监视器的替代方法是Dependency Walker,用于测试是否缺少依赖项。
  • 如何在 ASP.Net 应用程序上执行此操作,并且我仅将 winforms exe 和 dll 复制到单独的文件夹中,它工作正常

标签: .net asp.net-mvc iis iis-7 windows-server-2008


【解决方案1】:

确保所有托管程序集的目标是x86,而不是项目属性中的Any CPU 或x64。

【讨论】:

  • 试过了。我相信 DLLImport 引用的 DLL 是用 Delphi 编写的
  • @Jon,我说的是托管程序集,包括用于 ASP.NET 应用程序的程序集。只要非托管代码是有效的 32 位库,使用什么语言都没有关系。
  • ASP.Net MVC 应用程序也是针对 x86 构建的,但没有运气
  • @Jon,如果您删除对非托管库的调用,您的应用程序是否正常工作?
  • 是的。如果我去 mysite/home/index 它会出错。如果我去 mysite/home/up 就可以了。它只是在对外部 dll 进行方法调用的索引操作中出错
【解决方案2】:

您最好在 64 位模式或任何 CPU 模式下构建非托管 dll。有时,当我们在托管应用程序的应用程序池中启用 32 位应用程序时,它会加载 32 位程序集。如果它不适用于此选项,则应将其替换为 64 位库。同时回收应用程序池并重启iis。希望它会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2019-10-17
    • 2018-02-14
    • 2011-12-11
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多