简而言之:我有一个带有静态字典的控制台应用程序,这些字典在编写它们的项目中运行良好。我如何正确引用这个项目,以便从不同的项目中执行相同的操作?每次尝试调用函数将数据加载到它们时,都会出现错误。
长话短说:对于一个学校项目,我正在为一家垃圾收集公司制作一个使用本地搜索算法的调度器。我在控制台应用程序中拥有一切(项目名称: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.FileNotFoundExceptionHResult=0x80070002Message=无法加载文件或程序集"System.Runtime,Version=4.2.20,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"或其依赖项之一。系统找不到指定的文件。来源=StackTrace:
我做错了什么?
您不能将Console应用程序用作库。您要么必须将其转换为库类型项目,要么以"的形式运行;。exe";具有适当的参数。
因此,从技术上讲,有三种选择:
- 如果您不再需要控制台应用程序,只需将项目类型更改为类库:
右键单击项目->属性->应用程序->输出类型:"类库">
-
如果您仍然需要Console应用程序,并且希望在Console和WinForms之间共享相同的逻辑,请将所有逻辑移动到类库,并在Console和WinForms中同时使用。
-
如果您只需要控制台应用程序的输入/输出数据,您可以将其作为外部应用程序运行(但这是最糟糕的情况(
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(); }
Ciao,在这种情况下,我总是创建一个类库项目。然后,在控制台应用程序中,我添加对类库的引用。尝试这种方法并检查异常是否消失。