.net - .NET 4 出现 "The specified procedure could not be found"错误

标签 .net dllimport dll

我正在使用 Visual Studio 2012 (11.0.51106.01 Update 1) 在 64 位 Windows 7 机器上进行开发。

我有一个支持项目,可以将一些 C 代码编译成(32 位)DLL。在我的标题中,我有:

#define RET_TYPE(type) _declspec(dllexport) type __stdcall

RET_TYPE(int) test_dll_call(int invar);

在我的 C 文件中,我有:
RET_TYPE(int) test_dll_call(int invar)
{
   int retVal = 4 * invar;

   return retVal;
}

我还有一个(32 位)WPF C# 应用程序,它在类中加载 DLL,如下所示:
[DllImport("MyDll.dll", CharSet = CharSet.Ansi, BestFitMapping = true, ThrowOnUnmappableChar = true)]
public static extern int test_dll_call(int invar);

这被包装如下:
public void Wrap_TestDllCall()
{
   try
   {
      int outTest = 0;
      int invar = 3;

      outTest = test_dll_call(invar);
   }
   catch (Exception ex)
   {
      dllError = ex.ToString();
   }
}

当我在我的开发盒上的调试器中运行它时,这工作正常。如果我将所有相关文件复制到一个单独的文件夹并从那里运行它,它工作正常。

如果我将所有必需的文件夹复制到另一台运行 32 位 Windows XP SP3 的计算机,我会收到以下错误:
System.DllNotFoundException: Unable to load DLL 'MyDll.dll': The specified procedure could not be found. (Exception from HRESULT: 0x8007007F)
   at MyNamespace.MyClass.test_dll_call(Int32 invar)
   at MyNamespace.MyClass.Wrap_TestDllCall()

我在编译的 exe 和 dll 上都使用了依赖项walker;它找到的唯一丢失的 dll 是 wer.dllieshims.dll ,根据我的研究,XP 不需要。

我已经安装了 VS2012 C++ Redistributable、.NET 4 和 .NET 4.0.3 更新。仍然没有运气。

编辑 正如 Hans 所指出的,这似乎是应用程序在 DLL 中找不到程序;我也试过:
[DllImport("MyDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int test_dll_call(int invar);


__declspec(dllexport) int __cdecl test_dll_call(int invar);

这在我的开发箱上也能正常工作,但在 WinXP 箱上出现相同的错误。

帮助!

最佳答案

问题解决了。在我执行故障排除步骤时需要注意的一些事项,以供将来偶然发现的人使用。

  • 这个错误并不一定意味着它找不到过程 X -- 更确切地说,这可能意味着它找不到函数 Y ,来自另一个 dll,由 X 调用.
  • 确保在“发布”模式下编译 DLL,因为 C++ 可再发行组件将不包括调试 DLL。
  • 从一个 shell 函数开始,然后一个接一个地添加回去。

  • 在我上面的测试示例中,问题是我编译为 Debug 版本。

    但是,在我的完整功能中,该更改并没有解决问题。事实证明我错过了一些依赖步行者没有捕捉到的 DLL。

    关于.net - .NET 4 出现 "The specified procedure could not be found"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904080/

    相关文章:

    c# - 我应该重用作为参数传递的集合吗

    java - XSL 转换 - 通过字符串内容选择节点 ID

    Python-Ctypes : OSError: exception: access violation writing 0xFFFFFFFFFA1C001B

    c++ - 共享库 (.so) 文件是否需要在链接时出现(或指定)?

    c++ - 找出加载 DLL 的原因

    c# - 检索 asp :TextBox 的值

    c# - 结合滑动和绝对过期

    c# - 卸载使用 DllImport 加载的 DLL

    c++ - 删除指针数组会使调用者的应用程序崩溃

    c# - 无法加载 DLL 找不到指定的模块。 (来自 HRESULT : 0x8007007E) 的异常