未能加载文件或程序集“SqlServerDal”或它的某一个依赖项。系统找不到指定的文件。...

本文详细阐述了在使用工厂模式时遇到找不到程序集问题的解决方法,并通过实例介绍了数据库接口工厂的创建过程。重点讨论了如何正确对应程序集名称与命名空间,以及在配置和加载程序集时应注意的关键细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个挺怪的问题,采用了工厂模式后,出去找不到程序集的问题:
未能加载文件或程序集“Tianyige.SqlServerDAL”或它的某一个依赖项。系统找不到指定的文件。

解决思路:
以前遇到过这类问题,问题在于对程序集和命名空间名称混淆了,比如:命名空间叫SQLServerDAL,而程序集可能叫“Tianyige.SQLServerDAL”,或者叫成“SqlServerDAL”,都会发生找不到对象的错误。解决方法是对应好程序集的名称:
Assembly.Load("Tianyige.SqlServerDAL").CreateInstance("Tianyige.SqlServerDAL.Category");通过bin文件夹下找到相应的DLL,确定其名称。
而这次名称对应好了,看得我眼都花了,一点错没有,还是有问题。最后将错误提示中的文件的dll文件[Tianyige.SqlServerDAL]复制到网站APP下的bin目录中,问题得以解决。

模仿pet shop4做了个工厂模式的简单例子,初步了解其中流程,做个总结。
一、创建项目IDAL,包含若干接口如 IOrder,是有关Order的数据库操作接口。
二、创建项目SQLServerDAL,其中包含一个Order类,继承IOrder接口,具体实现该接口中声明的若干函数。
三、创建项目DALFactory,就是一个数据库接口工厂,负责根据选择的数据库类型(在web.config中获取如<add key="WebDAL" value="SQLServerDAL"/>)来创建相应数据库操作接口实例。如下述代码:
public static IOrder CreateOrder()
{
string path = "SQLServerDAL";
string className = path + ".Index";
return (IOrder)Assembly.Load(path).CreateInstance(className);
}
四、创建项目BLL,负责业务逻辑实现。其中需要调用数据库操作函数的时候声明
private static IOrder iOrder = DataAccess.CreateOrder();
然后调用IOrder中声明(SQLServerDAL.Order类中定义)的函数。
上面就是一个基本的过程,其中需要注意几点:
1、数据接口工厂DALFactory中CreateOrder函数声明成static,其他有关的地方也要用static,因为此处是利用反射动态加载程序集,所以加载一次就够了,网上偶然看了资料,据说即使多次执行加载语句也只会加载一次。
2、会出现“未能加载文件或程序集“SQLServerDAL”或它的某一个依赖项。系统找不到指定的文件”的情况。其实原因贼简单,就是无法找到该程序集,主要是没理解它运行的机制,其实如果
Assembly.Load(path).CreateInstance(className);
写成
Assembly.Load(“SQLServerDAL.dll").CreateInstance(className);
就清楚了,这找的不是一个名称空间,而是在bin里的一个dll文件。而项目SQLServerDAL默认生成的dll文件的名字是SQLServerDAL.dll,于是就会出现以上的错误。那么只要在该项目属性里把程序集名称改成“SQLServerDAL“就行了。
编程的路太长了,很多的基础要打,太多的技术要学,快失去信心了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值