系统.DllNotFoundException: 无法加载DLL。在开发机器上没有错误,但在目标机器上出现错误。

11
我用Visual Studio 2012基于WPF构建了一个C#应用程序,使用C++ DLL并针对.NET4.5。我有两个项目在运行,一个是C#项目,另一个是C++ DLL项目。我将这两个项目发布到同一个文件夹中,其中包含一个C#的.exe和一个C++的.dll
我在开发机上运行它们一切正常。但在其他机器上运行.exe时,会抛出以下异常:

System.DllNotFoundException: 无法加载DLL

它无法识别与其在同一文件夹中的DLL。
我尝试了许多方法,但似乎都没有起作用。我按照这篇文章中的解决方案进行操作,但仍然不起作用。
开发机和目标机器是相同的。唯一的区别是在开发机上安装了Visual Studio 2012。

代码:

C#:

[DllImport(@"Wireless.dll", EntryPoint = "?cert_exists@certificate@CertFuncs@@SAHHPBD@Z", CallingConvention = CallingConvention.Cdecl)]
    static extern int cert_exists(int store, [MarshalAs(UnmanagedType.LPTStr)]string cert_str);

C++:

static int __declspec(dllexport) cert_exists(int type, LPCSTR cert_str);

更新:

如果我在目标计算机上安装Visual Studio 2012,一切都正常。如果我移除它,应用程序会再次崩溃。你有什么想法吗?是什么使 Visual Studio 能够让这个应用程序工作?


你需要在这里展示一些实例代码。你尝试了什么?如果你发布了代码,我们也许可以在这里帮助你... 这听起来像一个问题是你已经硬编码了路径到 .dll 文件(即 F:\SomeDir\someDLL.dll),你需要使用相对路径(即 .\SomeDLL.dll)。 - MoonKnight
C++是托管的还是非托管的?你是如何从C#应用程序中引用它的? - Pete
C++是非托管的。我添加了一些代码。 - Maher Manoubi
所以你有一个部署目录,其中包含exe和dll文件,它(1)与开发目录分开,(2)在开发机器上工作,但是(3)在用户的机器上无法工作? - kol
1
两台机器都是Windows 7 64位操作系统,它们来自同一镜像,完全相同。 - Maher Manoubi
显示剩余5条评论
2个回答

11

仅供参考:在用户的计算机上安装Microsoft Visual C++ 2012 Redistributable Package。您使用的本地DLL可能有其他依赖项,必须安装(尝试使用Dependency Walker)。如果本地DLL需要例如注册表设置、配置文件等,则这些也应该存在。它应该以与您在开发机器上安装它相同的方式分发到用户机器上。


我刚刚尝试了,但仍然没有任何进展,它仍然找不到 DLL。我怀疑 DLL 上有保护措施,使其只能在开发机器上运行,但我并不确定。 - Maher Manoubi
我会尝试使用Dependency Walker并看看会发生什么。 - Maher Manoubi
1
沃克告诉我应用程序 DLL 是针对不同的 CPU,但事实并非如此,因为它们具有相同的 CPU。 - Maher Manoubi
依赖项检查器在用户机器上告诉您什么?您是否已安装所有依赖项? - kol
5
是的,这是Visual C++可视化库的x86版本,而不是x64版本,它可以解决所有问题!基本上,如果没有它,操作系统无法读取x86动态链接库。另外一种方法是将动态链接库以x64格式分发,但这会带来更大的问题,所以我会让客户安装VC++ x86。非常感谢你的帮助 :) 我非常感激。 - Maher Manoubi
显示剩余5条评论

0
这是由于您的项目构建配置为“Debug”(右键单击解决方案''->属性->'配置属性'->您应该看到所有项目配置都设置为'Debug')所致。它需要在运行exe的地方安装Visual Studio(该exe是以“Debug”模式构建的)。
为了避免这种情况,请将配置更改为“Release”并重新构建您的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接