【发布时间】: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 时程序崩溃的新问题,您可能应该发布一个新问题并提供更多信息。