C# 如何找到非exe程序的C入口点?

C# 如何找到非exe程序的C入口点?,c#,entry-point,C#,Entry Point,我读到的关于C入门级的所有信息都与: static int Main(string[] args) 因为这是特定于EXE程序的 但我的程序是解决方案中的C Automation Test framework.cs,使用Specflow功能文件和步骤定义设计 我现在添加了一个名为Program.cs-Int Main class的入口点类,但我注意到在运行自动化测试时,这个入口点类在任何时候都不会被调用。很可能是因为我的程序不是EXE程序,而是测试框架 如何找到非exe程序的C入口点 由于我想使

我读到的关于C入门级的所有信息都与:

static int Main(string[] args)
因为这是特定于EXE程序的

但我的程序是解决方案中的C Automation Test framework.cs,使用Specflow功能文件和步骤定义设计

我现在添加了一个名为Program.cs-Int Main class的入口点类,但我注意到在运行自动化测试时,这个入口点类在任何时候都不会被调用。很可能是因为我的程序不是EXE程序,而是测试框架

如何找到非exe程序的C入口点

由于我想使用一个类中的“报告”代码,该类将在每次运行测试时调用:

namespace Project.Core
{
    public class Program
    {
        public static int Main(string[] args)
        {
            Adapter.DefaultSearchTimeout = 5000;

            int error;
            try
            {
                error = TestSuiteRunner.Run(typeof (Program), Environment.CommandLine);
            }
            catch (Exception e)
            {
                TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
                Report.Screenshot();
                throw new ApplicationException("Error Found", e);
            }
            return error;
        }
    }
}

非exe项目,即DLL没有入口点。它们是由具有自己入口点的其他进程调用的API

您应该为您与SpecFlow一起使用的测试框架研究适当的测试前方法。例如,在MSTest中,此类代码将放入一个签名为的方法中:

[TestInitialize]
public void TestInitialize()
{
    // Your code
}

非exe项目,即DLL没有入口点。它们是由具有自己入口点的其他进程调用的API

您应该为您与SpecFlow一起使用的测试框架研究适当的测试前方法。例如,在MSTest中,此类代码将放入一个签名为的方法中:

[TestInitialize]
public void TestInitialize()
{
    // Your code
}

由于我的项目同时使用MsTest和Ranorex API,我无法确定在测试运行之前/期间初始化项目的哪个方面。因此,我决定将Try/Catch代码结构直接添加到项目中的每个步骤定义方法中

Try()
{
    // code
}
Catch (Exception e)
{
    TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
    Report.Screenshot();
    throw new ApplicationException("Error Found", e);
} 
我可以轻松地将Catch代码移动到helper类中,这样我的项目中只使用了一个代码实例:

catch (Exception)
{
    WpfHelpers.ExtensionMethods.CatchException(null);
}
助手类:

public static class ExtensionMethods
{
    public static void CatchException(SystemException e)
        {
            TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
            Report.Screenshot();
            throw new ApplicationException("Error Found", e);
        }
}

请注意,我使用此结构是为了在出现故障时使用Ranorex的Report.Screenshot功能。

由于我的项目同时使用MsTest和Ranorex API,我无法确定在测试运行之前/期间初始化项目的哪个方面。因此,我决定将Try/Catch代码结构直接添加到项目中的每个步骤定义方法中

Try()
{
    // code
}
Catch (Exception e)
{
    TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
    Report.Screenshot();
    throw new ApplicationException("Error Found", e);
} 
我可以轻松地将Catch代码移动到helper类中,这样我的项目中只使用了一个代码实例:

catch (Exception)
{
    WpfHelpers.ExtensionMethods.CatchException(null);
}
助手类:

public static class ExtensionMethods
{
    public static void CatchException(SystemException e)
        {
            TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
            Report.Screenshot();
            throw new ApplicationException("Error Found", e);
        }
}

请注意,我使用此结构是为了在发生故障时使用Ranorex的Report.Screenshot功能。

不熟悉Specflow,但它是一个加载和运行代码的程序吗?如果是这样的话,您必须查看Specflow的文档,了解它如何决定加载哪些类、运行哪些方法以及顺序。很可能,它会实例化您的一个类并在其上调用非静态方法,因此更改静态主方法的放置位置可能不会产生任何效果。请尝试阅读SpecFlow。不熟悉SpecFlow,但它是加载和运行代码的程序吗?如果是这样的话,您必须查看Specflow的文档,了解它如何决定加载哪些类、运行哪些方法以及顺序。很可能,它会实例化您的一个类并在其上调用非静态方法,因此更改静态主方法的位置可能不会产生任何效果。请尝试阅读SpecFlow。感谢您对“非exe项目,即DLL没有入口点”的解释。这非常有用。我正在使用MsTest,但不幸的是[TestInitialize]并没有像我所期望的那样成为一种尝试。由于我的项目同时使用MsTest和teh Ranorex API,我无法确定在测试运行之前/期间初始化项目的哪个方面。因此,我决定将Try/Catch代码结构直接添加到项目中的每个方法中。您可以尝试添加每个方法和属性[AssemblyInitialize]、[ClassInitialize]、[TestInitialize]、[TestCleanup]、[ClassCleanup]和[AssemblyCleanup]中的一个如MSDN文档中所述,将其添加到您的项目中,并在调试器中逐步完成它,然后查看发生了什么,从而为您提供了更多的见解。随着时间的推移,您可能会发现,随着测试数量的增加,在每个方法中使用try-catch变得不可维护。感谢您对“非exe项目,即DLL没有入口点”的解释。这非常有用。我正在使用MsTest,但不幸的是[TestInitialize]并没有像我所期望的那样成为一种尝试。由于我的项目同时使用MsTest和teh Ranorex API,我无法确定在测试运行之前/期间初始化项目的哪个方面。因此,我决定将Try/Catch代码结构直接添加到项目中的每个方法中。您可以尝试添加每个方法和属性[AssemblyInitialize]、[ClassInitialize]、[TestInitialize]、[TestCleanup]、[ClassCleanup]和[AssemblyCleanup]中的一个如MSDN文档中所述,将其添加到您的项目中,并在调试器中逐步完成它,然后查看发生了什么,从而使您更具洞察力
T随着时间的推移,您可能会发现,随着测试数量的增加,在每个方法中使用try-catch变得不可维护。我建议您只在catch块中使用throw,而不是抛出一个新的异常,以便在MSTest结果中获得所有异常元数据,即类型和原始stacktrace,而不是每一次失败都是从测试代码中抛出的ApplicationException。这一点很好。我现在已经使用这两种方法进行了测试:抛出新的ExceptionError发现,e;和throwe;。搏动;返回更清晰的读取异常处理stacktrace:->错误:在1000ms内找不到路径“//nothing”的元素。测试方法-Tests.Features.ReportScreenshotFeature.ReportScreenshot引发异常:Ranorex.ElementNotFoundException:在1000ms内找不到路径“//nothing”的元素。您应该在原始catch中使用throw,而不是在CatchExceptionException中使用throw e,以便保留堆栈跟踪。我建议您在捕获块而不是抛出新异常,这样您就可以在MSTest结果中获得所有异常元数据,即类型和原始stacktrace,而不是每个失败都只是从测试代码中抛出的ApplicationException。这一点很好。我现在已经使用这两种方法进行了测试:抛出新的ExceptionError发现,e;和throwe;。搏动;返回更清晰的读取异常处理stacktrace:->错误:在1000ms内找不到路径“//nothing”的元素。测试方法-Tests.Features.ReportScreenshotFeature.ReportScreenshot引发异常:Ranorex.ElementNotFoundException:在1000ms内找不到路径“//nothing”的元素。您应该在原始catch中使用throw,而不是在CatchExceptionException中使用throw e,以便保留stacktrace。