【问题标题】:C++ Unmanaged DLL in C# runtime import failureC# 运行时导入失败中的 C++ 非托管 DLL
【发布时间】:2016-04-04 12:06:16
【问题描述】:

我正在使用 32 位架构的 Microsoft Visual Studio 2013 上运行 C# XNA 游戏项目。 尝试在运行时使用 DllImport 标记加载非托管 C++ DLL 时,出现以下错误。请注意,此 dll (fmod_event.dll) 来自位于 /fmoddesignerapi/api/ 下的 FMOD Ex Programmer’s API

“System.DllNotFoundException”类型的未处理异常。
附加信息:无法加载 DLL 'fmod_event':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)

代码被跟踪,导入失败。

[DllImport("fmod_event")]
private static extern RESULT FMOD_EventSystem_Create(ref IntPtr eventsystem);

我已将 dll 添加到项目的根目录并将其设置为“如果较新则复制”。我可以确保这个 dll 存在于 DEBUG 和 RELEASE bin 文件夹中的正确位置。

当通过相同的下载文件导入位于 /api/ 下的“fmodex.dll”时,我没有遇到同样的问题,并且使用以下代码一切正常:

[DllImport("fmodex")]
private static extern RESULT FMOD_System_Create(ref IntPtr system);

这两个 dll 都可以在同一个 bin 文件夹下看到。
我尝试使用 fmod_event.dll 32 和 64,但没有任何运气。

谁能提供任何关于为什么一个 DLL 正确加载而另一个 DLL 加载不正确的见解?谢谢

【问题讨论】:

标签: c# c++ dll xna fmod


【解决方案1】:
  • 将 .DLL 指定为扩展名
  • 确保文件存在于 PATH 中,或在 DllImport 中指定完整路径
  • 检查是否存在此 DLL 的依赖模块。使用 Dependency Walker 查找依赖 DLL 是否存在以及是否可加载。
  • 检查 32 位和 64 位问题。 32位进程无法加载64位DLL,反之亦然

【讨论】:

  • 这很奇怪,但你已经解决了。我确实必须为 fmod_event 指定 .DLL。但似乎其他 DLL 不受它的影响。谢谢:)
【解决方案2】:

通常所有非托管 DLL 都需要注册。如果 fmod_event.dll 不是安装包的一部分,请尝试在其上运行 regsvr32 以注册它。

【讨论】:

  • 这不是真的,除非非托管/本机 DLL 是 COM,并且有人正在使用 COM 来使用它。
  • 此外,即使 regsvr32 有效,因为该模块包含一个 DllRegisterServer 导出,这意味着它是一个 COM 服务器,因此您不需要 DllImport 任何东西。您只需使用 COM。除了作为 COM 服务器之外,一个模块很少包含一堆导出
猜你喜欢
  • 2010-10-14
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多