4

我正在使用 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.dlland ieshims.dll,根据我的研究,XP 不需要这些 dll。

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

编辑正如汉斯指出的那样,这似乎是应用程序无法在 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 盒上也会出现同样的错误。

帮助!

4

1 回答 1

6

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

  1. 此错误不一定意味着它无法找到过程X- 而是可能意味着它无法Y从另一个 dll 中找到由X.
  2. 确保在“发布”模式下编译 DLL,因为 C++ 可再发行组件不包含调试 DLL。
  3. 从一个 shell 函数开始,然后一个接一个地添加。

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

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

于 2013-02-20T04:21:33.917 回答