首页 > 解决方案 > 如何正确引用 C# 中不同项目中的代码?

问题描述

简而言之:我有一个带有静态字典的控制台应用程序,它在编写它们的项目中工作正常。我如何正确引用这个项目,以便我可以从不同的项目中做同样的事情?每次我尝试调用函数将数据加载到其中时都会出错。

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

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

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=无法加载文件或程序集'System.Runtime,版本=4.2.2.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'或其依赖项之一。该系统找不到指定的文件。来源=堆栈跟踪:

我究竟做错了什么?

标签: c#code-structure

解决方案


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

因此,从技术上讲,有 3 个选项:

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

右键单击项目-> 属性-> 应用程序-> 输出类型:'类库'

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

  2. 如果您只需要来自控制台应用程序的输入/输出数据 - 您可以将其作为外部应用程序运行(但这是最坏的情况)

        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();
        }
    

推荐阅读