Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
.net 我可以强制MSTest在每次测试运行时使用新进程吗?_.net_Visual Studio_Pinvoke_Mstest - Fatal编程技术网

.net 我可以强制MSTest在每次测试运行时使用新进程吗?

.net 我可以强制MSTest在每次测试运行时使用新进程吗?,.net,visual-studio,pinvoke,mstest,.net,Visual Studio,Pinvoke,Mstest,我们正在使用VS2010测试运行程序(MSTest)进行自动化功能测试。当我们从Visual Studio运行测试时,VS创建了一个名为QTAgent32.exe的进程,并在该进程中运行测试 我们发现,当我们执行多个测试运行时,MSTest将重用同一个QTAgent32进程—进程ID不会更改。这对我们来说是个问题,因为我们正在测试的代码是对非托管DLL的P/调用。在进程的生命周期内,DLL只需初始化一次。我们有一个[AssemblyInitialize]方法,但它在每次测试运行时执行一次。如果我

我们正在使用VS2010测试运行程序(MSTest)进行自动化功能测试。当我们从Visual Studio运行测试时,VS创建了一个名为QTAgent32.exe的进程,并在该进程中运行测试

我们发现,当我们执行多个测试运行时,MSTest将重用同一个QTAgent32进程—进程ID不会更改。这对我们来说是个问题,因为我们正在测试的代码是对非托管DLL的P/调用。在进程的生命周期内,DLL只需初始化一次。我们有一个[AssemblyInitialize]方法,但它在每次测试运行时执行一次。如果我们执行多个测试运行,它将在同一进程中执行多次

每次我们进行测试运行时,MSTest都会创建一个新的appdomain;但这些应用程序域都处于相同的过程中


所以我想知道:有没有一种方法可以告诉VisualStudio测试运行人员在每次运行测试时使用一个新的进程?我查看了“.testsettings”配置,但没有看到任何相关的内容。

不知道您希望它走多远,但一个解决方案可能是创建单元测试主机

这个链接展示了如何创建适配器,然后您还可以为evertest启动一个新流程,创建一个管道通信,并在测试后将其拆掉

我知道MS本身使用不同的主机在moles下运行测试


在阅读了Wiktor关于FreeLibrary()的评论后,我能够让它正常工作

我使用Mike Stall创建的,它提供了LoadLibrary、GetProcAddress和FreeLibrary的包装。这样,我可以在每次测试运行中加载库一次,调用必要的方法,然后在测试运行结束时释放库

Mike Stall的代码使用,它将非托管函数指针转换为托管委托类型

我必须用委托类型的声明替换[DllImport]外部声明。所以我转换了这个:

[DllImport("asesignal.dll")]
public static extern bool ASESDK_Initialize(string licenseCode);
为此:

public delegate bool ASESDK_Initialize(string licenseCode);
Mike Stall的代码包含带有一般委托(操作等)的示例。但是我不能让它工作,所以我创建了自己的委托类型

我可以动态加载DLL,如下所示:

_ht = new UnmanagedLibrary(@"c:\windows\system32\asesignal.dll");
要调用函数,请执行以下操作:

var function = _ht.GetUnmanagedFunction<ASESDK_Initialize>("ASESDK_Initialize");
function(licenseCode);
var function=_ht.GetUnmanagedFunction(“ASESDK_Initialize”);
功能(许可证代码);

感谢Wiktor和np hard的帮助

VS 2013及以后版本现在在“测试>测试设置>保持测试执行引擎运行”下对此进行了设置。取消选中此选项将在每次运行时启动一个新引擎。

出于好奇-是否可能在使用
FreeLibrary
进行每次连续测试后卸载非托管DLL?谢谢Wiktor-建议不错。现在代码只是静态地引用非托管API,在C#extern函数声明上使用[DllImport]属性。我假设.NET在appdomain被拆除时不会自动释放库,因为我们会遇到错误。我实际上不知道如何从C#代码调用动态加载的DLL—您可以调用LoadLibrary()和GetProcAddress(),然后以某种方式将返回的函数指针强制转换为委托类型吗?无论如何,我会调查的-谢谢!我发现这可能会有帮助:我有一些C++代码我正在测试,我可以确认MSSTEST不会在测试之间卸载DLL。它也不调用全局变量析构函数,所以我觉得它一直都是同一个可执行文件。谢谢!我来看看。我不知道你可以创建自定义主机。现在,我们正在查看是否有不同的测试运行程序(例如Gallio Icarus),每次都可以在新流程中运行测试。这实际上只是交互开发和测试时的一个问题-在构建服务器上,我们在一个测试过程中只运行了一个测试。这似乎没有效果,它仍然在Visual Studio 2013中为我在同一个过程中运行所有测试