无法从ASP.NET调用DLL

本文关键字:调用 DLL NET ASP | 更新日期: 2023-09-27 18:24:37

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

所以我创建了一个C#DLL,它将调用C DLL。当我执行consoleap时,它运行良好,但当我尝试从ASP.NET调用相同的DLL时,它会给出错误消息

我不理解的错误

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

还有其他一些关于这方面的帖子,但与我的背景不符我想我错过了asp.net 的permissions

这是我的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

无法从ASP.NET调用DLL

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

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

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

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

这告诉您如何设置应用程序池。若要设置应用程序池,您可以检查此链接。

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

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