前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工厂模式的Assembly.Load(path).CreateInstance(className)出错解决方法

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

作者头像
令仔很忙
修改2019-08-07 16:25:47
1.6K0
修改2019-08-07 16:25:47
举报
文章被收录于专栏:令仔很忙令仔很忙

 1、问题描述

★代码展示

下面是Factory中的一段代码: 

代码语言:javascript
复制
'**********************************************
' 文 件 名: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)      ’容易出错不易理解的地方
代码语言:javascript
复制

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

代码语言:javascript
复制
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("命名空间.类"),而不管在哪一层写这段代码其中的("程序集")读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的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、结束语

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年07月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •  1、问题描述
    • ★代码展示
      •   ★相关知识了解
      • 2、 出现的问题及解决方法
        • ★未能加载文件或程序集“DAL”或它的某一个依赖项,系统找不到指定文件
          •   ★未将对象引用设置到对象的实例
          • 3、结束语
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档