我有代码要求我将Pinvoke转换为第三方原生DLL。问题是,当我使用Nunit测试运行器进行这些测试时,本机dll被nunit进程(nunit.exe和nubit-agent.exe)锁定。因此,我的构建后复制命令因此而失败。
生成“成功构建”(包括构建后命令)的唯一方法是首先关闭Nunit,重建项目并重新打开Nunit(清洗,冲洗和重复)。这变得乏味和令人沮丧。
有没有办法强制单位将所有句柄释放到已加载的程序集上?我对NUnit设置进行了一些调整,但无济于事。
旁注:我所拥有的其他想法是关于我实际使用这个第三方dll的方式(它实际上是QuantLib的C#SWIG版本)。因此,实际上可能存在包装器C#代码和使用的IDisposable模式的问题(基于我在另一个问题上收到的评论)。
答案 0 :(得分:0)
您可以使用unlocker to release all handles等工具中的命令行选项。或者您可以将pinvoke函数加载到单独的应用程序域中,然后释放域。
编辑:
在第二种情况下。创建AppDomain然后将P / Invokes的程序集加载到该域中,但不要将该程序集加载到主App Domain中。然后在测试完成后卸载App Domain。 See here for an example.卸载域后,也应释放P / Invoked Dlls。