如何在 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 个选项:
- 如果您不再需要控制台应用程序 - 只需将项目类型更改为 Class 库:
Right-click Project -> Properties -> Application -> Output Type:
'Class Library'
如果您仍然需要控制台应用程序并希望在控制台和 WinForms 之间共享相同的逻辑 - 将所有逻辑移至 Class 库并在控制台和 WinForms 中同时使用。
如果您只需要来自控制台应用程序的 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();
}
简而言之:我有一个带有静态词典的控制台应用程序,它在编写它们的项目中运行良好。如何正确引用该项目,以便我可以在不同的项目中执行相同的操作?每次尝试调用函数将数据加载到其中时,我都会出错。
长话短说:对于一个学校项目,我正在使用本地搜索算法为垃圾收集公司制作调度程序。我在控制台应用程序(项目名称: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 个选项:
- 如果您不再需要控制台应用程序 - 只需将项目类型更改为 Class 库:
Right-click Project -> Properties -> Application -> Output Type: 'Class Library'
如果您仍然需要控制台应用程序并希望在控制台和 WinForms 之间共享相同的逻辑 - 将所有逻辑移至 Class 库并在控制台和 WinForms 中同时使用。
如果您只需要来自控制台应用程序的 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(); }