Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致了C++;在单元测试(NUnit或MSTest)中从C#调用函数,以从控制台应用程序中运行的相同代码生成不同的结果?_C#_C++_Dllimport - Fatal编程技术网

是什么导致了C++;在单元测试(NUnit或MSTest)中从C#调用函数,以从控制台应用程序中运行的相同代码生成不同的结果?

是什么导致了C++;在单元测试(NUnit或MSTest)中从C#调用函数,以从控制台应用程序中运行的相同代码生成不同的结果?,c#,c++,dllimport,C#,C++,Dllimport,我用dLimPosiP/Unjk调用C语言中的C++ DLL。DLL由第三方生成,并且仅为x86(因此我们的C#代码也构建为x86) 如果我从控制台应用程序调用DLL上的某个函数,我总是得到一个正确的结果。该函数获取文件路径并从文件中提取一些信息 该函数的签名为: private static extern int Function( string str1, int bool1, ref uint outUint1, ref uint outUint2,

我用dLimPosiP/Unjk调用C语言中的C++ DLL。DLL由第三方生成,并且仅为x86(因此我们的C#代码也构建为x86)

如果我从控制台应用程序调用DLL上的某个函数,我总是得到一个正确的结果。该函数获取文件路径并从文件中提取一些信息

该函数的签名为:

private static extern int Function(
    string str1,
    int bool1,
    ref uint outUint1,
    ref uint outUint2,
    ref uint outUint3,
    ref double outDouble1,
    ref double outDouble2,
    StringBuilder outStr1);
意外结果出现在一个
ref uint
参数中

如果我创建一个单元测试并调用完全相同的代码(使用所有参数和硬编码),我会得到完全不同的结果,这是不正确的。错误的结果总是一样的。我尝试了MSTest和NUnit测试,使用了不同的跑步者,结果相同

产生正确结果的案例:

  • 控制台应用程序
  • Winforms应用程序
  • 运行代码但从单元测试(NUnit)启动的控制台应用程序
产生错误结果的案例:

  • 从Resharper测试运行程序(NUnit)进行测试运行
  • 从Visual Studio测试运行程序(MSTest)进行测试运行
  • 从NUnit GUI测试运行程序进行测试运行
  • 从NUnit控制台测试运行程序进行测试运行
我的测试环境是Windows8,C#是为针对.NETFramework4的x86构建的

你们有没有人知道是什么导致了这个问题,或者我可以做些什么来进一步调试它

我肯定会尝试联系创建DLL的第三方,但对导致此问题的确切原因有一个很好的了解将大大增加解决此问题的机会。

听起来它期望的“文件路径”可能与工作目录有关,或者工作目录甚至应用程序目录对dll都很重要

该dll也可能尝试引用其目录中的其他dll,但找不到它们,因为它是从自己的文件夹加载的,而不是从其目录中运行的exe

大约到一半时,它描述了dll解析的搜索顺序:

  • 从中加载应用程序的目录

  • 当前目录

  • 系统目录。使用GetSystemDirectory函数获取 此目录的路径

  • 16位系统目录。没有函数可以获得 此目录的路径,但已对其进行搜索

  • Windows目录。使用GetWindowsDirectory函数获取 此目录的路径

  • PATH环境变量中列出的目录。 请注意,这不包括指定的每个应用程序路径 通过应用程序路径注册表项。在以下情况下不使用应用程序路径键: 计算DLL搜索路径

  • 希望有帮助

    编辑:另一个想法。。。您可以为该DLL编写一个包装器,使其返回正确的值,并创建一个与内置在包装器中的unit tester一起工作的接口。

    听起来它所期望的“文件路径”可能与工作目录有关,或者工作目录甚至应用程序目录对DLL很重要

    该dll也可能尝试引用其目录中的其他dll,但找不到它们,因为它是从自己的文件夹加载的,而不是从其目录中运行的exe

    大约到一半时,它描述了dll解析的搜索顺序:

  • 从中加载应用程序的目录

  • 当前目录

  • 系统目录。使用GetSystemDirectory函数获取 此目录的路径

  • 16位系统目录。没有函数可以获得 此目录的路径,但已对其进行搜索

  • Windows目录。使用GetWindowsDirectory函数获取 此目录的路径

  • PATH环境变量中列出的目录。 请注意,这不包括指定的每个应用程序路径 通过应用程序路径注册表项。在以下情况下不使用应用程序路径键: 计算DLL搜索路径

  • 希望有帮助


    编辑:另一个想法。。。您可以为该DLL编写一个包装器,使其返回正确的值,并创建一个与内置在包装器中的unit tester一起工作的接口。

    好的结果和坏的结果有什么不同?一个还是很多?是否所有“不正确”的流道产生相同的不正确结果?所有不正确的流道产生相同的不正确结果。经过进一步研究,我发现错误的结果与外部库设置为使用不同的方法从提供的文件中提取信息时产生的结果相同,因此我怀疑它无法使用主要方法提取信息(这将导致正确的结果)然后回到另一种方法(产生错误的结果)。现在我只需要弄清楚为什么从NUnit运行时无法使用主方法。正如@phyatt提到的,NUnit在自己的沙箱中运行代码,它可能不同于您的输出目录。您可以使用来查看DLL试图访问的文件,这可能会对正在发生的事情有所帮助。只是一个想法。好的和坏的结果有多不同?一个还是很多?是否所有“不正确”的流道产生相同的不正确结果?所有不正确的流道产生相同的不正确结果。经过进一步研究,我发现错误的结果与外部库设置为使用不同的方法从提供的文件中提取信息时产生的结果相同,因此我怀疑它无法使用主要方法提取信息(这将导致正确的结果)