我的代码有什么问题?显示未处理的异常:System.IO.FileNotFoundException
What is wrong with my code? Showing Unhandled Exception: System.IO.FileNotFoundException
我正在学习 c#,我正在尝试使用 Three Tier Architecture
和 Factory Method Design Pattern
进行基本登录 Console Application
。我添加了所有层并实现了与登录应用相关的所有逻辑。
但是当我尝试使用 dotnet run
命令 运行 代码时,它要求输入,输入后它给出错误
Unhandled Exception: System.IO.FileNotFoundException: Could not load
file or assembly 'DataAccessLogic, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null'. The system cannot find the file specified.
at BusinessLogic.User.getUserName()
at FactoryMethod.Program.Main(String[] args) in C:\Users\xxx\Desktop\FactoryPatternSample\FactoryMethodSampleApplication\FactoryMethod\Program.cs:line 14
尽管文件存在于 BusinessLogic.User.getUserName();
此处提供代码
ILogin.cs
public interface ILogin
{
bool AttemptLogin();
string getUserName();
}
User.cs
using System;
using DataAccessLogic;
namespace BusinessLogic
{
class User:ILogin
{
private string m_username;
private string m_password;
public User(string username, string password)
{
this.m_username = username;
this.m_password = password;
}
public bool AttemptLogin()
{
if(m_username.Equals("abc") && m_password.Equals("abc123"))
{
return true;
}
return false;
}
public string getUserName()
{
IGetDetails objectType = GetDetails.getDetails(m_username);
Console.WriteLine(objectType.getStudentName());
return objectType.getStudentName();
}
}
}
IGetDetails.cs
using System;
namespace DataAccessLogic
{
public interface IGetDetails
{
string getStudentName();
string getStudentId();
}
}
GetDetails.cs
namespace DataAccessLogic
{
public class GetDetails
{
public static IGetDetails getDetails(string username)
{
Console.WriteLine(username);
IGetDetails objectType = null;
objectType = new GetValue(username);
return objectType;
}
}
}
GetValue.cs
namespace DataAccessLogic
{
public class GetValue:IGetDetails
{
private string m_username = string.Empty;
public GetValue(string username)
{
this.m_username = username;
}
public string getStudentName()
{
return m_username;
}
public string getStudentId()
{
return "2205";
}
}
在Program.cs
ILogin loginType = Login.attemptLogin(email, password);
if(loginType.AttemptLogin())
{
Console.WriteLine("Name: "+ loginType.getUserName());
}
in loginType.getUserName() 给出错误,如果我将 getUserName()
方法更改为仅 return 一个像 "hello" 这样的字符串,它会给出输出,但是当我尝试 return 来自对象 IGetDetails
的字符串给出错误。
完整源代码Github
如有任何帮助,我们将不胜感激。
提前致谢。
正如我从您的 FactoryMethod.csproj
文件中看到的,您没有在 FactoryMethod
项目中引用 DataAccessLogic
。这就是为什么 DataAccessLogic.dll
没有 复制到 bin/Debug/netcoreapp2.0/
文件夹并且异常消息字面上告诉你的原因。
您可以手动复制此文件并检查您的应用程序 运行 现在是否可用,但这会更好地修复您的引用。
解释:
您将 BusinessLogic
引用为 外部文件依赖项 (..\BusinessLogic\obj\Debug\netstandard2.0\BusinessLogic.dll
),而不是 项目到项目 .这样 .Net CLR 对 BusinessLogic
依赖关系一无所知,只是 copy-if-newer 这个文件到 FactoryMethod
项目的输出目录。
然后,在 运行 时,CLR 将看到,在 Program.cs
文件的第 14 行,它需要一个 GetDetails
class,它位于 DataAccessLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
组装。它试图从一个工作目录加载这个程序集,但没有找到它,所以它抛出 System.IO.FileNotFoundException
.
解法:
始终手动复制此文件或修复您的引用,这样FactoryMethod
项目将引用BusinessLogic
项目(不是文件)。这可以在 Reference Manager
window.
中的 Projects
选项卡中完成
现在 Visual studio 将构建过时的 BusinessLogic
项目和 copy-if-newer
它的所有依赖项。
另外,用同样的方法修复BusinessLogic
项目中的引用。
有个不错的docs about references。看一看。
我正在学习 c#,我正在尝试使用 Three Tier Architecture
和 Factory Method Design Pattern
进行基本登录 Console Application
。我添加了所有层并实现了与登录应用相关的所有逻辑。
但是当我尝试使用 dotnet run
命令 运行 代码时,它要求输入,输入后它给出错误
Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'DataAccessLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified. at BusinessLogic.User.getUserName() at FactoryMethod.Program.Main(String[] args) in C:\Users\xxx\Desktop\FactoryPatternSample\FactoryMethodSampleApplication\FactoryMethod\Program.cs:line 14
尽管文件存在于 BusinessLogic.User.getUserName();
此处提供代码
ILogin.cs
public interface ILogin
{
bool AttemptLogin();
string getUserName();
}
User.cs
using System;
using DataAccessLogic;
namespace BusinessLogic
{
class User:ILogin
{
private string m_username;
private string m_password;
public User(string username, string password)
{
this.m_username = username;
this.m_password = password;
}
public bool AttemptLogin()
{
if(m_username.Equals("abc") && m_password.Equals("abc123"))
{
return true;
}
return false;
}
public string getUserName()
{
IGetDetails objectType = GetDetails.getDetails(m_username);
Console.WriteLine(objectType.getStudentName());
return objectType.getStudentName();
}
}
}
IGetDetails.cs
using System;
namespace DataAccessLogic
{
public interface IGetDetails
{
string getStudentName();
string getStudentId();
}
}
GetDetails.cs
namespace DataAccessLogic
{
public class GetDetails
{
public static IGetDetails getDetails(string username)
{
Console.WriteLine(username);
IGetDetails objectType = null;
objectType = new GetValue(username);
return objectType;
}
}
}
GetValue.cs
namespace DataAccessLogic
{
public class GetValue:IGetDetails
{
private string m_username = string.Empty;
public GetValue(string username)
{
this.m_username = username;
}
public string getStudentName()
{
return m_username;
}
public string getStudentId()
{
return "2205";
}
}
在Program.cs
ILogin loginType = Login.attemptLogin(email, password);
if(loginType.AttemptLogin())
{
Console.WriteLine("Name: "+ loginType.getUserName());
}
in loginType.getUserName() 给出错误,如果我将 getUserName()
方法更改为仅 return 一个像 "hello" 这样的字符串,它会给出输出,但是当我尝试 return 来自对象 IGetDetails
的字符串给出错误。
完整源代码Github
如有任何帮助,我们将不胜感激。
提前致谢。
正如我从您的 FactoryMethod.csproj
文件中看到的,您没有在 FactoryMethod
项目中引用 DataAccessLogic
。这就是为什么 DataAccessLogic.dll
没有 复制到 bin/Debug/netcoreapp2.0/
文件夹并且异常消息字面上告诉你的原因。
您可以手动复制此文件并检查您的应用程序 运行 现在是否可用,但这会更好地修复您的引用。
解释:
您将 BusinessLogic
引用为 外部文件依赖项 (..\BusinessLogic\obj\Debug\netstandard2.0\BusinessLogic.dll
),而不是 项目到项目 .这样 .Net CLR 对 BusinessLogic
依赖关系一无所知,只是 copy-if-newer 这个文件到 FactoryMethod
项目的输出目录。
然后,在 运行 时,CLR 将看到,在 Program.cs
文件的第 14 行,它需要一个 GetDetails
class,它位于 DataAccessLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
组装。它试图从一个工作目录加载这个程序集,但没有找到它,所以它抛出 System.IO.FileNotFoundException
.
解法:
始终手动复制此文件或修复您的引用,这样FactoryMethod
项目将引用BusinessLogic
项目(不是文件)。这可以在 Reference Manager
window.
Projects
选项卡中完成
现在 Visual studio 将构建过时的 BusinessLogic
项目和 copy-if-newer
它的所有依赖项。
另外,用同样的方法修复BusinessLogic
项目中的引用。
有个不错的docs about references。看一看。