查找C#中引用的非托管c ++ dll的依赖项

时间:2015-10-22 18:33:27

标签: c# c++ .net dll unmanaged

我有一个C#winforms应用程序,它使用我在c ++中编写的dll作为非托管代码。在4台测试计算机上,程序正常运行。在8台测试计算机上运行程序时出错。

  

无法加载DLL" myUnmanaged.dll"。指定的模块无法找到。

有问题的dll与c#exe位于同一目录中。 Visual Studio设置为将文件复制到"编译" c#exe。

由于该程序适用于某些计算机而不适用于其他计算机,因此我猜测应用程序所使用的计算机上已经存在一些已经存在的程序,这些程序是我的程序工作所必需的。

我会注意到我的非托管dll包含来自名为SetupApi.dll的Windows工具包中的另一个dll的调用。让Visual Studio正确引用此dll需要将VS直接指向它的lib文件以使我的dll进行编译。正确运行我的程序的所有计算机都有setupapi.dll位于windows \ system32目录中。一些没有正确运行我的程序的计算机也有setupapi.dll位于windows \ system32目录中。对于测试,我将setupapi.dll放在与我的c#exe相同的目录中,并在没有工作的计算机上重新测试,结果是相同的。

如何找出我错过的哪些文件/相关内容阻止我的应用在某些计算机上运行?

我使用VS express 2013编写软件。它缺少专业版的一些功能。一种解决方案是生成一个MSI文件,它将包含依赖项。但这是我无法访问的专业功能。

对此事的任何帮助将不胜感激。

有关32位/ 64位的信息:
c#应用程序和非托管c ++ dll都是用32位(x86)构建的。程序工作的3台测试计算机是64位win OS(vista 64位,win7 64位,win8.1 64位),程序运行的测试计算机之一是Win7 32位。我的应用程序无法运行的计算机包括32位和64位计算机。因此,我相当确定我的问题与操作系统的位数无关。

1 个答案:

答案 0 :(得分:0)

  

请使用.net reflactor或dependancy walker确保您使用   根据您的需要提供x86或x64版本 - Gilad

对原始问题的评论最终得到了解决方案。我按照建议使用依赖walker找到丢失的dll。