【问题标题】:P/Invoke in ASP.NET (Dll not found exception)ASP.NET 中的 P/Invoke(未找到 Dll 异常)
【发布时间】:2012-03-27 08:38:07
【问题描述】:

我有一个通过 C++ 项目生成的 .dll。我必须在我的 ASP.NET 项目中使用这个 dll,并且我已经在我的项目中为此编写了 DllImport 函数。

App_Code 内部的静态类有一些DllImport 函数

public static class Functions
{
    [DllImport("MyFav.dll", EntryPoint = "fnmain", 
     CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern StringBuilder fnmain();
}

由于我无法将 C++ dll 作为引用直接添加到我的 ASP.NET 项目中(因为它不是 .NET 程序集),所以我只是将其复制到顶层目录中。 (ASP.NET项目名称->右键->添加现有项)

现在,当我尝试运行项目时,出现以下错误:

例外:

无法加载 DLL 'MyFav.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

有什么建议吗? .dll 存放在哪里?

【问题讨论】:

  • 可能找不到 dll,也可能找到了 dll,但您使用了一些库(如 mfc),但在 asp.net 帐户使用的目录中未找到

标签: c# c++ asp.net dll


【解决方案1】:

.dll 应该在您的 asp.net 应用程序的 \bin 文件夹中。

显然有一些关于如何解析 dll 的规则。见Dynamic-Link Library Search Order on msdn

你也可以试试:

[DllImport("C:\path_to_dll\MyFav.dll", EntryPoint = "fnmain", 
 CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnmain();

如果这一切都不起作用,那么您的 MyFav.dll 可能还有其他未解决的依赖项。您可以使用Dependency Walker 来检查这些。

【讨论】:

  • 您还可以使用 LoadLibrary 使用指向其当前位置的完整路径加载 DLL。
  • 我尝试将 .dll 放在 \bin 文件夹中,但没有成功,然后使用了完整路径,它成功了。但是,对于 .dll 的完整路径,虽然它找到了 dll,但是当我尝试触发该函数时出现错误。错误截图:i.imgur.com/Qq5vM.png
  • @Cipher 好吧,据我所知,这可能是MyFav.dll 中的错误,而不是因为您引用错误。
  • .dll 在 C# 桌面项目中可以正常工作,但在 ASP.NET 项目中不能正常工作。不确定
  • 也许你的 dll 导入应该是 public static extern string fnmain(); ?
【解决方案2】:

我遇到了类似的错误,但使用的是 Mono 的 XSP 服务器。对于此服务器,解决方案是将 dll 放入 Web 应用程序的根目录(./bin 的父文件夹)。这恰好也是当前工作目录(从 Xamarin Studio 运行时),这可能是相关的。

【讨论】:

    【解决方案3】:

    如果要与 out path 一起使用,请将 dll 粘贴到项目文件夹中的 bin 目录中 .

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 2019-05-05
      • 2011-12-10
      • 1970-01-01
      • 2015-03-17
      • 2023-03-08
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多