是什么导致了C++;在单元测试(NUnit或MSTest)中从C#调用函数,以从控制台应用程序中运行的相同代码生成不同的结果?
我用dLimPosiP/Unjk调用C语言中的C++ DLL。DLL由第三方生成,并且仅为x86(因此我们的C#代码也构建为x86) 如果我从控制台应用程序调用DLL上的某个函数,我总是得到一个正确的结果。该函数获取文件路径并从文件中提取一些信息 该函数的签名为:是什么导致了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,
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控制台测试运行程序进行测试运行
编辑:另一个想法。。。您可以为该DLL编写一个包装器,使其返回正确的值,并创建一个与内置在包装器中的unit tester一起工作的接口。好的结果和坏的结果有什么不同?一个还是很多?是否所有“不正确”的流道产生相同的不正确结果?所有不正确的流道产生相同的不正确结果。经过进一步研究,我发现错误的结果与外部库设置为使用不同的方法从提供的文件中提取信息时产生的结果相同,因此我怀疑它无法使用主要方法提取信息(这将导致正确的结果)然后回到另一种方法(产生错误的结果)。现在我只需要弄清楚为什么从NUnit运行时无法使用主方法。正如@phyatt提到的,NUnit在自己的沙箱中运行代码,它可能不同于您的输出目录。您可以使用来查看DLL试图访问的文件,这可能会对正在发生的事情有所帮助。只是一个想法。好的和坏的结果有多不同?一个还是很多?是否所有“不正确”的流道产生相同的不正确结果?所有不正确的流道产生相同的不正确结果。经过进一步研究,我发现错误的结果与外部库设置为使用不同的方法从提供的文件中提取信息时产生的结果相同,因此我怀疑它无法使用主要方法提取信息(这将导致正确的结果)