如何在 C# 中正确引用不同项目中的代码?

How do I correctly reference to code in a different project in C#?

简而言之:我有一个带有静态词典的控制台应用程序,它在编写它们的项目中运行良好。如何正确引用该项目,以便我可以在不同的项目中执行相同的操作?每次尝试调用函数将数据加载到其中时,我都会出错。

长话短说:对于一个学校项目,我正在使用本地搜索算法为垃圾收集公司制作调度程序。我在控制台应用程序(项目名称:LocalSearch)中拥有所有内容,但我想制作一个可视化工具,以便更好地分析它生成的解决方案。为此,我正在使用 Windows 表单应用程序(项目名称:ScheduleVisualiser),我想引用控制台应用程序,这样我就不必再次加载数据了。

在控制台应用程序中,我在程序 class 中完成了所有数据加载。我有以下代码:

public static Dictionary<int, Order> Orders = new Dictionary<int, Order>();

public static void Main()
{
    LoadData();
    ...
}

public static void LoadData()
{
    ...
}

现在我有了我的 WFA 并且我添加了控制台应用程序作为参考,但是当我这样做时 LocalSearch.Program.LoadData(),Visual Studio 进入中断模式并抛出以下预期:

System.IO.FileNotFoundException HResult=0x80070002 Message=Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. Source= StackTrace:

我做错了什么?

再见,在这种情况下,我总是创建一个 Class 图书馆项目。然后,在控制台应用程序中,我添加了对 Class 库的引用。尝试这种方式并检查异常是否消失。

您不能将控制台应用程序用作库。您要么必须将其转换为库类型项目,要么 运行 作为具有适当参数的“.exe”。

所以技术上有 3 个选项:

  1. 如果您不再需要控制台应用程序 - 只需将项目类型更改为 Class 库:

Right-click Project -> Properties -> Application -> Output Type: 'Class Library'

  1. 如果您仍然需要控制台应用程序并希望在控制台和 WinForms 之间共享相同的逻辑 - 将所有逻辑移至 Class 库并在控制台和 WinForms 中同时使用。

  2. 如果您只需要来自控制台应用程序的 input/output 数据 - 您可以 运行 它作为外部应用程序(但这是最糟糕的情况)

        using (Process process = new Process())
        {
            process.StartInfo.FileName = "ipconfig.exe";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.Start();
    
            // Synchronously read the standard output of the spawned process.
            StreamReader reader = process.StandardOutput;
            string output = reader.ReadToEnd();
    
            // Write the redirected output to this application's window.
            Console.WriteLine(output);
    
            process.WaitForExit();
        }