【问题标题】:How do I get a complex return value from a Main() in C#如何从 C# 中的 Main() 获取复杂的返回值
【发布时间】:2012-08-29 20:36:36
【问题描述】:

用C#编写的exe文件 我需要将一个复杂的返回值返回给另一个 C# 项目

这是我的代码:

class Program
{
    private class MyObject
    {
        private int num;

        public int Num
        {
            get
            {
                return (this.num);
            }
            set
            {
                this.num = value;
            }
        }

        public MyObject(int num)
        {
            this.Num = num;
        }

    }

    [STAThread]
    public static MyObject Main(string[] args)
    {
        return new MyObject(5);
    }
}

这给了我以下错误: ...\ConsoleApplication1.exe' 不包含适合入口点的静态“Main”方法。

我尝试过使用它,但没有成功让它返回一个复杂的值。

【问题讨论】:

  • 你为什么需要它?在程序之间发送对象的方法有很多种。

标签: c# return exe


【解决方案1】:

您不能通过 Main 方法执行此操作,该方法旨在作为流程的入口点。

如果您正在编写直接从其他代码调用的代码,那么您几乎肯定应该构建一个类库项目。您可以将一个应用程序的引用添加到另一个应用程序,但这并不常见(至少在单元测试之外)。如果你想这样做,你应该调用一个不同的方法而不是Main。 (您可以在一个类中以这种方式声明Main 方法,并使用不同的类作为“正常”入口点,但这似乎毫无意义地复杂。)

【讨论】:

  • 我如何从 .exe 中获取返回值,而不是在 main 中写入返回值?如果我调用另一个函数,它只会将它的值返回给 main 我需要 main 将值返回给我拥有的 C# 代码......
  • @KostyaSydoruk 从 main 的返回传统上用于简单地指示程序是否正常退出。如果您需要比这更复杂的信息,请考虑将程序的“输出”写入文件。或者使用库到库调用(正如 Jon 解释的那样),或者使用进程间通信(例如 wcf)。但是从 main 返回的信息是相当简单的信息,而不是您要查找的信息。
  • @KostyaSydoruk:您可以使用某种进程间通信方法(套接字、管道、stdin/stdout 等),或者使用文件系统来传达您的返回值。
  • @LMC +1 用于指导较低级别的原则(即套接字、管道、标准输入/标准输出)。鉴于 OP 的示例,我选择提及 WCF 的面向对象的 api。
  • @KostyaSydoruk:还要注意类库没有 Main 方法。它定义了您可以在其他应用程序中使用但不像应用程序那样运行的类型和方法。但是,如果您必须从另一个正在运行的 应用程序获取一些信息,则返回值无论如何都不会帮助您。在这种情况下,您将需要某种进程间通信(如 LMC 所说)。
【解决方案2】:

如前所述,如果您将 exe 作为独立的可执行文件调用,则必须运行 Main,而您得到的只是传统的进程输入/输出。

但如果您确实需要,您也可以将 exe 作为库引用。

如果这是您的 exe 的代码:

public class MyObject
{
    private int num;

    public int Num
    {
        get
        {
           return (this.num);
        }
        set
        {
           this.num = value;
        }
    }

    public MyObject(int num)
    {
        this.Num = num;
    }    
}

public class Program
{
    public static MyObject DoWork(int num)
    {
        return new MyObject(num);
    }

    [STAThread]
    public static int Main(string[] args)
    {
        DoWork(5);

        return 0;
    }
}

从另一个 exe 或 dll(假设您已经引用了第一个 exe),您可以像这样调用代码:

MyObject obj = Program.DoWork(8)

不过,这是一种非常不寻常的方法。如果你的库在多个地方定义了你需要的丰富类/方法,你真的应该把它们放在一个 dll 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多