DLL Hell(p) - 适用于开发框,但不适用于

时间:2015-08-07 06:26:17

标签: c# .net wpf dll

3天拔毛。它没有任何意义。我无法弄清楚我错过了什么。

所以我有这个C#/ WPF VS2013pro项目我在我的Visual Studio机器上工作正常:Win 8.1 x64但由于未找到'而失败。在任何目标PC上,我将其移植到。

它使用FreeImage,它有两个DLL: FreeImage.dll - 完成所有工作的C ++ FreeImageNet.dll - .NET包装器在C#中变得简单 这两个需要位于同一目录中,最好与.exe相同 - 所以它们是。

我的项目是64位。我下载了FreeImage的源码并为x64编译了两个DLL:首先是CPP,然后是.NET。然后将它们复制到解决方案中。 我的解决方案中引用了.net DLL。当然,CPP没有提及。两者都是解决方案的一部分,并在构建解决方案时复制到%outputdir%(Bin / Debug或Bin / Release)。该程序在DEBUG和我的开发PC上的RELEASE中运行良好,DLL方法可以完成它们的工作。

我将整个BIN目录复制到运行相同版本Windows的另一台PC,相同的更新,工作......程序运行但是当需要FreeImage.dll中的方法时,它会失败,并且#34;无法找到dll"。

enter image description here

enter image description here

为了确保我在我的VS机器上使用来自BIN目录(而不是System32或SysWOW64)的dll,我把它拉出并运行应用程序:是的,它失败了。 我把它放回去并移动整个目录:它有效 我把它拉出来:它失败了 我把它放回去并移动到一个拇指驱动器:它的工作原理 {你明白了} 所以在这一点上,它确实似乎真的使用与.exe和.NET包装器dll相同的目录中的那个

我将拇指驱动器与我在VS机器上运行的代码一起移动到另一台PC:它失败了。

接下来我尝试远程调试到另一台PC:所有文件都复制到匹配的目录,调试启动并运行,我从远程PC获得输出和断点行为:只有需要DLL的调用因FreeImageNet而再次失败。 DLL无法找到FreeImage.dll

我在Visual Studio机器上没有做任何特别的事情来使FreeImage工作:我下载了源码并编译然后将DLL复制到解决方案并引用了.NET dll - 那就是它。

我已经谷歌搜索,并在SourceForge上研究并打开了有关它的问题。 我在此问题上发现的每个问题都是有人认为FreeImageNet.dll是自包含的并且没有意识到它必须位于FreeImage.dll旁边的情况

  • 我已检查注册表,我已检查HKLM / System / CurrentControlSet / Control / SessionManager / KnownDLLs /
  • 的注册表
  • 我试图用regsrver32注册它(是的,64位风味)
  • 我尝试过设置一个环境变量。
  • 我尝试将DLL复制到DLL搜索顺序中的每个目录。
  • 我在Win8.1x64pro(与我的Visual Studio pc相同)和两台Win7x64pro机器上尝试过它。

我认为在FreeImage的3.16中有一些奇怪的怪癖,并且在以前的版本中一次又一次地使用3.6,结果相同。

我为解决方案构建了一个安装程序,并将其安装在工作的VS计算机上,并将其安装在失败的测试计算机上。

我第一次尝试(而不是那么成功)虚拟化我的物理PC。对于测试环境,VMware一直对我很好,此时我想看看Visual Studio计算机的完全克隆是否会成功或失败。

所以......任何人都有想法?

2 个答案:

答案 0 :(得分:0)

Darn it,我错过了一个:vcomp120.dll

似乎它是随Visual Studio一起安装的Visual C ++可再发行组件的一部分。

我应该知道我需要包含这个,但整个EMGUcv包正在运行......而且我讨厌C ++并且在十几年内没有使用它......这一点完全没有发生在我身上。

答案 1 :(得分:-2)

您可以尝试使用DLLIMPORT导入dll。复制并将dll放在与exe相同的目录中,并在Code behind中使用以下代码:

[DllImport("FIBITMAP.dll")]
public static extern void Load(string param1,string param2,...);

这里Param1,Param2,...将是函数Load的参数。 希望这会有所帮助。