【问题标题】:C# Interop, Library Not FoundC# 互操作,未找到库
【发布时间】:2014-06-13 23:48:53
【问题描述】:

我计划将我的许可系统的核心迁移到 C++,但我仍然更喜欢 .NET 前端进行设计。无论如何,我刚刚阅读完互操作功能,并决定对其进行测试。问题是,它对我来说只是花花公子,但不适用于任何其他用户。我让两个朋友在他们的电脑上测试了一个小程序,他们得到“无法加载'xxx.dll'。找不到指定的模块。”

我在与程序本身相同的路径中读取库的 C# 程序,因此该错误没有任何意义。如前所述,它对我来说效果很好。

C# 代码,

[DllImport("GuardImports.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string Gz_GetSystemKey();

我无法设置动态路径,因为 DDLImport 只接受常量变量。我想尝试类似的东西,

private const string loc = Application.StartupPath + "/xxx.dll";

但这显然行不通,因为字符串不是常量。如果有人感兴趣,可以在这里下载程序(http://neetcloud.us/MqMIXc),没什么特别的。该程序只是从库中接收一个散列字符串,并将其显示在一个消息框中。

【问题讨论】:

  • GuardImports.dll 文件是否在您运行程序的文件夹中,但不在您朋友的文件夹中?
  • 我已经给了他们这个程序的库,他们在同一个路径中。
  • 嗯,也许是 32 位与 64 位的依赖关系?或者 dll 依赖于您 PC 上的其他 dll,而您的朋友不依赖 - 使用 Depends.exe 实用程序检查。可能在系统事件日志中没有与错误相关的十六进制错误代码吗?
  • 'HRESULT 的异常:0x8007007E',实际上是找不到库。
  • 就像我说的,你不能在没有安装 Visual Studio 的 PC 上运行为调试而构建的 C++ dll,所以我认为这就是你的朋友收到 0x8007007E 错误的原因。至于您在为 Release 构建 C++ dll 时程序崩溃的新问题,您可能应该发布一个新问题并提供更多信息。

标签: c# c++ interop


【解决方案1】:

根据 cmets 中的讨论,您的问题似乎是您的 C++ DLL 是为调试而构建的,并且无法在未安装 Visual Studio 的 PC 上运行。或者也许可以,但微软有各种要求,并说一般你不能这样做。

http://msdn.microsoft.com/en-us/library/aa985618.aspx

【讨论】:

    【解决方案2】:

    经过一个非常非常漫长的夜晚,我已经调试了这个问题。存在的问题是我没有在预处理器定义中定义我的导出。现在一切都在相应地工作。感谢那些花时间给我支持的人。

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多