【问题标题】:Unable to call the DLL from ASP.NET无法从 ASP.NET 调用 DLL
【发布时间】:2012-02-15 15:26:58
【问题描述】:

您好,我有一个 C Dll,它将与一个 cobol 应用程序交互。我们想通过互联网将数据发送到 cobol。

所以我创建了一个 C# DLL,它将调用 C DLL。当我做一个控制台应用程序时它工作正常,但是当我尝试从 ASP.NET 调用相同的 DLL 时它给出错误消息

我不明白那个错误

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

还有其他一些关于此的帖子,但与我的上下文不符 我想我缺少 permissions 的 asp.net

这是我的 c# dll 中用于调用 c dll 的声明

[DllImport(@"C:\CCExpert\haz450cp.dll", EntryPoint = "Methodname", CallingConvention = CallingConvention.Cdecl)]
    unsafe public static extern void Methodname(ref p1, ref p2);

编辑:

您好,我根据您的建议更改了设置,但现在出现新错误

Microsoft Visual Studio C Runtime Library has detected a fatal error in w3wp.exe

【问题讨论】:

  • 如果您可以在控制台应用程序中使用上述声明调用此 .dll,则相同的声明在 ASP.NET 中应该可以正常工作。这使您更有可能遇到 IIS 的 32/64 位问题。

标签: c# asp.net web-services dll


【解决方案1】:

如果您有一个 C .dll,它将是 32 位或 64 位。您必须确保您的网站在正确的平台上运行(也就是说,您的网站作为匹配的 32/64 位网站运行。)

在 IIS 7 中,您可以通过右键单击应用程序池并选择 Advanced Settings 来配置应用程序池的位数。有一个名为Enable 32-bit applications 的设置,您需要将其设置为True 用于32 位站点,False 用于64 位站点。

您可以使用Dependency Walker 来查看 DLL 是 32 位还是 64 位:使用 View full paths(在工具栏上看起来像 C:\)以及 .dll 的依赖项和:

  • 如果您有 32 位操作系统,您的 .dll 可能是 64 位的。您将无法加载它。
  • 如果您有 64 位操作系统:
    • 如果依赖项在 System32 下,则为 64 位 .dll
    • 如果依赖项在 SysWOW64 下,则为 32 位 .dll

这告诉你如何设置应用程序池。要设置应用程序池,您可以查看this link

确保在打开应用程序池属性时使用Advanced Settings,而不是基本设置。此外,当您为您的网站调出属性时,这些设置不可用 - 它们仅适用于应用程序池。

【讨论】:

  • 我检查过了,但在我的 IIS 中找不到Enable 32-bit applications 选项
  • @RaghuveerGuthikonda:你用的是什么操作系统?
  • 我的操作系统是win 7 Ultimate 64bit
  • @RaghuveerGuthikonda:我用关于如何更新应用程序池的信息更新了我的答案 - 检查它是否有帮助。
  • 您好,我更新了问题,您知道为什么会出现错误吗?
【解决方案2】:

此问题的最可能原因是您试图将 32 位 DLL 加载到 64 位进程中(反之亦然)。要验证或排除这种情况,请检查 Asp.Net 是否在 64 位模式下运行,如果是,则需要 64 位版本的 C DLL

【讨论】:

  • 我想我有 32 位 dll 我现在无法更改 dll 我可以将 asp.net 更改为在 32 位下运行
  • @RaghuveerGuthikonda 我不确定你能做到。我找到的最好的信息在这里forums.iis.net/t/1152526.aspx
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多