工厂模式的Assembly.Load(path).CreateInstance(className)出错解决方法

简介: <h1><span style="font-size:24px"> 1、问题描述</span></h1> <h2><span style="font-size:24px">  </span><span style="font-size:18px">代码展示</span></h2> <p><span style="font-size:24px">  </span><span sty

 1、问题描述

  代码展示

  下面是Factory中的一段代码: 

'**********************************************
' 文 件 名:DataAcess
' 命名空间:Factory
' 内    容:
' 功    能:创建用户需要的接口
' 文件关系:
' 作    者:令仔很忙
' 小    组:
' 生成日期:2014-07-28 17:37:52
' 版 本 号:V2.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Reflection             '引用 反射 命名空间
Imports System .Configuration 
Public Class DataAcess
    Private Shared ReadOnly assemblyName As String = "DAL"   '数据程序集名称
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")
    ''' <summary>
    ''' 创建用户接口
    ''' </summary>
    ''' <returns>返回IUser</returns>
    ''' <remarks></remarks>
    Public Function CreateIUser() As IDAL.IUser
        Dim className As String = assemblyName + "." + strDB + "UserDAL"      '定义  命名空间.类
<pre name="code" class="vb"><span style="white-space:pre">	</span>Return CType(Assembly.Load(assemblyName).CreateInstance(className), IDAL.IUser)      ’容易出错不易理解的地方

 
在这段代码中,下面这一语句是不易理解,容易出错的地方 

Return CType(Assembly.Load(assemblyName).CreateInstance(className), IDAL.IUser)         
   

  相关知识了解

  下面咱们先了解Assembly.Load(path).CreateInstance(className)  

  在VB.NET中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: 
  System.Reflection命名空间
  (1)  AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
  (2)  Assembly:程序集类
  (3)  Module:模块类
  (4)  Type:使用反射得到类型信息的最核心的类


  他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.


  在上面的语句中我们用到的是Assembly这一类,在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFrom和LoadWithPartialName三个Assembly的静态方法.我们主要说Load方法:   

  

  Assembly.Load("")的使用说明如下;  
  并不是命名空间。常用的是程序集名称,也就是dll的名称  
  重载列表    
  名称说明 
  Assembly.Load(AssemblyName)在给定程序集的AssemblyName的情况下,加载程序集。


2、 出现的问题及解决方法

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

    关于反射Assembly.Load("程序集").CreateInstance("命名空间."),而不管在哪一层写这段代码其中的("程序集")读取的实际是webbin文件夹下的dll,也就是说你反射的类的程序集dllweb层的bin下必须有。

    注意CreateInstance()一定是命名空间.类名,否则创建的实例为空

    Assembly.Load("程序集名")

    

    出现这样的错误有三种可能:

    1)、DLL文件名与加载时的DLL文件名不一致。
    2)、.DLL文件根本不存在,即出现丢失情况。
    3)、加载DLL路径错误,即DLL文件存在,但加载路径不正确

   看了下自己的问题,主要就是上面的第三种情况,加载路径不正确,怎么解决?

    找到文件夹DAL/bin/Debug,将里面与DAL相关的文件复制到UI/bin/Debug中去,运行,就可以了,后期的工作,如果每次遇到这中情况都手动添加的话会很麻烦,所以我们需要更改程序的生成路径:

    


  未将对象引用设置到对象的实例

    上面的语句中的CreateInstance(className),中className其实是需要反射的类型全名(包括命名空间的全路径),如下图:最终className返回的结果是DAL.SqlUserDAL

  

它是和DAL层相对应的,所以DAL层下的类的命名必须和它保持一致


其实这个问题有很多种情况,这只是其中的一种出错的地方和解决方法。


3、结束语

  机房收费系统重构,刚开始开始敲三层或者开始敲七层,都是一段困难的过程,但是在这个过程中也是你进步最大的,不会了,多看看其他人的博客,多问,不理解可以先把别人的拿过来用,鲁迅先生在《拿来主义》中说过一句话:“有选择的拿,为我所用的拿,不卑不亢的拿”。借鉴是豁然开朗,是一种共鸣,为我所用,有更上一层楼的感觉;照抄是模仿,但走不出去,就会失去自我,如果说有临界点的话,那就是我说我的话,用自己的话别人能听懂而已。

    

 

    



  

  

相关文章
|
人工智能 自然语言处理 算法
Quiet-STaR:让语言模型在“说话”前思考
**Quiet-STaR** 是一种增强大型语言模型(LLM)推理能力的方法,它扩展了原有的**STaR** 技术,允许LLM为其生成的文本自动生成推理步骤。通过令牌并行抽样和学习的思想令牌,模型能同时预测单词和相关原理。教师强化指导确保输出的正确性。Quiet-STaR提升LLM在句子预测、复杂问题解答和推理基准测试上的表现,降低困惑度,促进更流畅的生成过程。未来研究将探索视觉和符号理由,以及结合可解释AI以提高模型透明度和定制化。[\[arXiv:2403.09629\]](https://arxiv.org/abs/2403.09629)
689 4
|
Java
Java 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。
305 0
|
中间件 API Go
使用Echo和Gin构建高性能Web服务的技术文档
本文档对比了Go语言中的两个流行Web框架——Echo和Gin。Echo是一个高性能、可扩展的框架,适合构建微服务和API,强调简洁API和并发性能。Gin基于net/http包,具有Martini风格API,以其快速路由和丰富社区支持闻名。在性能方面,Gin的路由性能出色,两者并发性能均强,内存占用低。文中还提供了使用Echo和Gin构建Web服务的代码示例,帮助开发者了解如何运用这两个框架。选择框架应考虑项目需求和个人喜好。
333 2
|
10月前
|
数据采集 Java 测试技术
精准测试如何落地
在快速迭代的软件开发环境中,精准测试作为一种高效、针对性的测试方法,正逐步成为企业的首选。本文探讨了精准测试的落地方法、对质量指标的影响、数据统计与跟踪度量、提高投入产出收益率的策略及卡点数据的具体内容。通过优化测试用例、代码关联、技术融合及流程优化,精准测试能够显著提升软件质量和测试效率。
|
存储
GIGE 协议摘录 —— GVSP 协议(三)(下)
GIGE 协议摘录 —— GVSP 协议(三)
539 1
|
XML 数据可视化 API
Android经典实战之约束布局ConstraintLayout的实用技巧和经验
ConstraintLayout是Android中一款强大的布局管理器,它通过视图间的约束轻松创建复杂灵活的界面。相较于传统布局,它提供更高灵活性与性能。基本用法涉及XML定义约束,如视图与父布局对齐。此外,它支持百分比尺寸、偏移量控制等高级功能,并配有ConstraintSet和编辑器辅助设计。合理运用可显著提高布局效率及性能。
789 0
|
缓存 算法 应用服务中间件
nginx 反向代理 与缓存功能
nginx 反向代理 与缓存功能
|
SQL 关系型数据库 分布式数据库
PolarDB常见问题之修改PolarDB-x默认端口号失败如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
安全
[UDS] --- CommunicationControl 0x28
[UDS] --- CommunicationControl 0x28
602 0
|
XML JSON 编解码
IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
接上篇《金蝶随手记团队的Protobuf应用实践(原理篇)》,本文将以iOS端的Objective-C代码为例,图文并茂地向您菔救绾卧趇OS工程中快速使用Protobuf,希望对你有帮助。
281 0
IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf