C# 启动执行委托的新进程
在.NET中,是否可以在子进程中执行方法(委托、静态方法等)C# 启动执行委托的新进程,c#,.net,windows,process,C#,.net,Windows,Process,在.NET中,是否可以在子进程中执行方法(委托、静态方法等)System.Diagnostics.Process似乎需要实际的文件名,这意味着需要一个单独的可执行文件 我试图做的是在单元测试中验证一个OS资源是否在进程退出时被清理。我知道可以使用CodeDOM或IL生成来创建这样的程序集并执行它,但单元测试的全部目的是隔离组件部分,而不是创建复杂性。出于同样的原因,我希望完全避免单独组装 理想情况下,我会这样做: public static void CreateCounter() {
System.Diagnostics.Process
似乎需要实际的文件名,这意味着需要一个单独的可执行文件
我试图做的是在单元测试中验证一个OS资源是否在进程退出时被清理。我知道可以使用CodeDOM或IL生成来创建这样的程序集并执行它,但单元测试的全部目的是隔离组件部分,而不是创建复杂性。出于同样的原因,我希望完全避免单独组装
理想情况下,我会这样做:
public static void CreateCounter()
{
var counter = new PerformanceCounter("category", "counter", "instance");
counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Process;
}
[Test]
public void TestResourceDisposal()
{
// Start child process to execute CreateCounter()
...
// verify the resource is disposed
}
首先,不,没有办法。I进程意味着一个.exe。这不是Unix,您可以在其中派生一个作为父进程副本的进程
我只需要创建一个小的.exe来运行。是否需要使用不同的性能计数器运行测试?如果它与其中一个一起工作,那么它肯定会与它们中的任何一个一起工作?我不确定您到底想实现什么,但是从CreateCounter返回性能计数器实例并使用using指令是否更容易,因为PerformanceCounter是IDisposable的。像这样:
using (var counter = CreateCounter())
{
// Do some work
}
然后计数器将始终被清理,即使您在测试过程中抛出
否则,我想你想要的是。然后可以使用thread.Join()等待线程完成。有关更多信息,请参阅。您所说的不是单元测试。与实际的(昂贵的)操作系统服务交互违反了单元测试要争取的基本隔离原则 如果您打算以更端到端的方式测试代码,实际与性能计数器交互等等,那么这将是一个集成测试,应该以更“繁重”的方式编写,即在需要时编写一个单独的EXE,运行任何复杂的设置或清理步骤,等等 如果需要对处理性能计数器的组件进行单元测试,则必须首先抽象掉此依赖关系。通常,您会创建一个表示性能计数器表面积的基类或接口,然后创建某种类型的类来在(测试)运行时替换其功能。实际系统将使用一个简单的包装器,该包装器将委托给实际的性能计数器,并将通过如上所述的集成测试来执行
通过阅读上面的评论,听起来您似乎在尝试测试.NET框架的保证。我怀疑这是否真的是必要的,因为它已经经过了很好的测试,尽管您可能希望测试代码是否正确地使用它(在这种情况下,您可以根据所寻求的验证进行单元测试或集成测试)。不幸的是,调用Dispose()或生成线程都不够。我正在专门测试perf counter实例名称的发布(由Windows),它被指定为仅在进程退出时发生-线程连接不会产生预期的效果,也不会进行Dispose()。请注意最后一段:是和否。我实际上是在测试我们自己的计数器包装器;通常一个模拟就足够了,但在这种情况下就没有那么多了。根据我的经验,性能计数器有一段闲逛的历史,并不总是按照它们应该的方式工作;测试(以任何名称)应该在这种行为发生时隔离它。因此,您似乎是对的——我找不到一种管理方式来做到这一点。我已经使用了CodeDOM路径,正在生成tiny.exe。谢谢