C\#프로그램 집합 과 반사 상세 설명

여기 서 제 가 또 몇 마디 잔 소 리 를 했 습 니 다.여러분 들 이 공부 할 때 책 을 읽 거나 동 영상 을 볼 때 매우 시원 합 니 다.기본적으로 다 알 아 보 는 것 도 쉬 운 것 같 기 때 문 입 니 다.사실은 알 아 보 는 것 은 하나의 일 입 니 다.당신 이 직접 만 드 는 것 은 하나의 일이 고 자신 이 말 할 수 있 는 것 은 또 다른 일 입 니 다.배 운 것 을 그대로 바 가 지 를 그 리 는 것 이 아니 라 자신의 것 으로 만들어 야 한다.
반 사 를 말 하기 전에 프로그램 집합 이 무엇 인지 알 아 보 겠 습 니 다.
프로그램 집합
프로그램 집합 은.net 의 개념 으로 프로그램 집합 은 관련 클래스 에 가방 을 싸 는 것 으로 볼 수 있 으 며 자바 의 jar 가방 에 해당 합 니 다.
프로그램 집합 포함:
  • 자원 파일
  • 유형 메타 데이터(코드 에서 정 의 된 모든 유형 과 구성원,바 이 너 리 형식 설명)
  • IL 코드(이것들 은 모두 exe 또는 dll 에 봉 인 됨)
  • exe 와 dll 의 차이.
    exe 를 실행 할 수 있 습 니 다.dll 은 직접 실행 할 수 없습니다.exe 에 main 함수(입구 함수)가 있 기 때 문 입 니 다.
    형식 메타 데이터 이 정 보 는 Assembly Info.cs 파일 을 통 해 정의 할 수 있 습 니 다.모든.net 프로젝트 에 하나의 Assembly Info.cs 파일,코드 형식 이 존재 합 니 다.
    
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    //               
    //      。          
    //          。
    [assembly: AssemblyTitle("ReflectedDemo")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("ReflectedDemo")]
    [assembly: AssemblyCopyright("Copyright © 2017")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    //   ComVisible     false          
    //   COM      。       COM           ,
    //         ComVisible       true。
    [assembly: ComVisible(false)]
    //        COM   ,    GUID        ID
    [assembly: Guid("7674d229-9929-4ec8-b543-4d05c6500863")]
    //                 : 
    //
    //      
    //       
    //      
    //      
    //
    //          ,     “   ” “   ”    ,
    //           “*”: 
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]
    
    이런 정 보 는 어디에서 나타 납 니까?저희 프로그램 집합의 속성 에 나타 나 도록 하 겠 습 니 다.

    우 리 는 평소에 CS 클 라 이언 트 프로그램 을 설치 할 때 설치 디 렉 터 리 아래 에서 많은 프로그램 집합 파일 을 볼 수 있 습 니 다.
    프로그램 집합 사용 의 장점
  • 프로그램 에서 필요 한 프로그램 집합 만 인용 하여 프로그램의 크기 를 줄 입 니 다.
  • 프로그램 집합 은 코드 를 봉인 할 수 있 고 필요 한 접근 인터페이스 만 제공 할 수 있 습 니 다.
  • 확장 이 편리 합 니 다.
  • 어떻게 프로그램 집합의 인용 을 추가 합 니까?
    프로그램 집합 경 로 를 직접 추가 하거나 솔 루 션 의 항목 참조 사항 을 추가 합 니 다.
    프로그램 을 확장 해 야 할 때 기 존 항목 에 직접 추가 할 수 있 습 니 다.그러면 이 코드 들 을 다른 사람 에 게 공유 하고 싶다 면?프로그램 집합 으로 포장 할 수 있 습 니 다.그리고 다른 사람 은 이 프로그램 집합 을 참조 하면 확장 할 수 있 습 니 다.우리 가 흔히 볼 수 있 는.net 제3자 프레임 워 크 라 이브 러 리,예 를 들 어 log 4 net,유 니 티 등.
    메모:반복 인용 을 추가 할 수 없습니다.
    순환 인용 을 추가 하 는 것 은 무엇 입 니까?즉,A 항목 이 B 항목 의 항목 인용 을 추가 하면 이때 B 항목 은 A 항목 의 항목 인용 을 추가 할 수 없습니다.즉,항목 인용 을 추가 할 때 우리 가 흔히 볼 수 있 는 3 층 프레임 워 크 간 의 항목 인용 과 같은 단 방향 이 어야 합 니 다.
    반사
    반사 에 관 해 서 는.net 개발 만 한다 면 매일 사용 할 것 이다.VS 의 스마트 힌트 는 반사 기술 을 응용 하여 이 루어 진 것 이 고 우리 가 자주 사용 하 는 반 컴 파일 신기 Reflector.exe 도 있 기 때문에 그 이름 을 보면 알 수 있다.프로젝트 에서 흔히 볼 수 있 는 것 은 설정 파일 과 결합 하여 데이터베이스 인 스 턴 스 를 전환 하거나 Sprint.net 의 설정 파일 을 통 해 의존 주입 을 실현 하 는 등 동적 실례 화 대상 입 니 다.
    반사 기술 은 프로그램 집합 에 있 는 메타 데 이 터 를 동적 으로 가 져 오 는 기능 입 니 다.반사 적 으로 dll 을 동적 으로 불 러 온 다음 에 이 를 분석 하여 대상 을 만 들 고 구성원 을 호출 합 니 다.
    Type 은 클래스 에 대한 설명 입 니 다.Type 류 는 반 사 를 실현 하 는 중요 한 클래스 입 니 다.이 를 통 해 우 리 는 클래스 의 모든 정 보 를 얻 을 수 있 습 니 다.방법,속성 등 을 포함 합 니 다.클래스 의 속성,방법 을 동적 으로 호출 할 수 있 습 니 다.
    반사 적 인 출현 으로 대상 을 만 드 는 방식 이 바 뀌 었 습 니 다.과거 에 만 든 대상 은 모두 new 를 통 해 직접 만 들 었 기 때 문 입 니 다.
    dll 에는 두 가지 부분 이 있 습 니 다.IL 중간 언어 와 metadate 요소 의 근거 입 니 다.
    .NET 에서 네 임 스페이스 를 반사 하 는 것 은 System.Reflection 입 니 다.여기 서 저 는 먼저 Demo 를 통 해 반사 가 무엇 을 할 수 있 는 지 보 겠 습 니 다.
    1、  새 콘 솔 프로젝트 ReflectedDemo
    2、  새 라 이브 러 리 항목 My.sqlserver.Da
    두 종류의 SqlServerHelper 와 SqlCmd 를 새로 만 듭 니 다.전 자 는 공유 클래스 이 고 후 자 는 사유 클래스 입 니 다.
    
    namespace My.Sqlserver.Dal
    {
      public class SqlServerHelper
      {
        private int age = 16;
        public string Name { get; set; }
        public string Query()
        {
          return string.Empty;
        }
      }
      class SqlCmd
      {
      }
    }
    3、  프로젝트 Reflected Demo,My.sqlserver.dal 의 프로젝트 인용 을 추가 합 니 다.프로젝트 Reflected Demo 의 bin 디 렉 터 리 에 항상 My.sqlserver.dal.dll 프로그램 집합 이 존재 하 는 것 을 편리 하 게 하기 위해 서 입 니 다.
    
    using System;
    using System.Reflection;
    namespace ReflectedDemo
    {
      class Program
      {
        static void Main(string[] args)
        {
          //       , bin     
          Assembly assembly = Assembly.Load("My.Sqlserver.Dal");
          Console.WriteLine("----------------Modules----------------------");
          var modules = assembly.GetModules();
          foreach(var module in modules)
          {
            Console.WriteLine(module.Name);
          }
          Console.WriteLine("----------------Types----------------------");
          var types = assembly.GetTypes(); //           ,          
          foreach(var type in types)
          {
            Console.WriteLine(type.Name);
            Console.WriteLine(type.FullName);
            var members= type.GetMembers(); //  Type        
            Console.WriteLine("----------------members----------------------");
            foreach(var m in members)
            {
              Console.WriteLine(m.Name);
            }
          }
          Console.WriteLine("----------------GetExportedTypes----------------------");
          var exportedTypes = assembly.GetExportedTypes(); //             
          foreach(var t in exportedTypes)
          {
            Console.WriteLine(t.Name);
          }
          Console.WriteLine("----------------GetType----------------------");
          var typeName= assembly.GetType("SqlServerHelper");//               
          Console.WriteLine(typeName.Name);
        }
      }
    }
    

    동적 생 성 대상
    ass.Create Instance(string typeName)와 Activator.Create Instance(Type t)방법 을 통 해
    그들 사이 의 차이
    ass.Create Instance(string type:Name)는 클래스 의 무 참 구조 함수 가 대상 을 만 들 고 반환 값 은 만 든 대상 입 니 다.무 참 구조 함수 가 없 으 면 오 류 를 보고 합 니 다.
    
    Assembly assembly = Assembly.Load("My.Sqlserver.Dal");
    object obj = assembly.CreateInstance("My.Sqlserver.Dal.SqlServerHelper");
    Console.WriteLine(obj.GetType().ToString());

    SqlServerHelper 류 의 코드 를 수정 하려 면 다음 과 같은 구조 함 수 를 추가 하 십시오.
    
        public SqlServerHelper(int age)
        {
          this.age = age;
        }
    이 럴 때 다시 실행 하면 인 스 턴 스 를 만 드 는 코드 가 잘못 되 고 컴 파일 할 때 잘못 되 지 않 습 니 다.

    그래서 저 희 는 보통 Activator.Create Instance 방법 으로 반사 대상 을 만 드 는 것 을 추천 합 니 다.이 방법 은 과부하 가 많 기 때문에 구조 함수 에 파 라 메 터 를 전달 하 는 것 을 지원 합 니 다.

    이때 다시 호출 하면 이상 이 생기 지 않 을 것 이다.
    Type 클래스 에는 세 가지 방법 이 있 습 니 다.
  • bool Is AssignableFrom(Type t):t 할당 을 통 해 현재 형식 변수 가 t 형식 변수의 할당 을 받 아들 일 수 있 는 지 판단 할 수 있 습 니까?
  • bool IsInstanceOfType(object o):대상 o 가 현재 클래스 의 인 스 턴 스 인지 판단 합 니 다.현재 클래스 는 o 의 클래스,부모 클래스,인터페이스
  • 일 수 있 습 니 다.
  • bool IsSubclassOf(Type t):현재 클래스 가 t 의 하위 클래스 인지 판단 하기
  • Type 클래스 에는 또 하나의 IsAbstract 속성 이 있 습 니 다.추상 적 인지 아 닌 지 를 판단 하고 인 터 페 이 스 를 포함 합 니 다.
    그들 이 자주 사용 하 는 이 유 는 우리 가 반 사 를 통 해 얻 을 수 있 는 것 이 너무 많아 서 우 리 는 데 이 터 를 여과 해 야 하기 때문이다.
    클래스 BaseSql 을 추가 하여 클래스 SqlServerHelper 를 BaseSql 에서 계승 합 니 다.
    그리고 호출 코드 보기:
    
          bool result = typeof(BaseSql).IsAssignableFrom(typeof(SqlServerHelper));
          Console.WriteLine(result);
    
       SqlServerHelper _SqlServerHelper = new SqlServerHelper(1);
       bool result = typeof(SqlServerHelper).IsInstanceOfType(_SqlServerHelper);
       Console.WriteLine(result);
    
          SqlServerHelper _SqlServerHelper = new SqlServerHelper(1);
          bool result = typeof(SqlServerHelper).IsSubclassOf(typeof(BaseSql));
          Console.WriteLine(result);

    프로젝트 에서 자주 사용 하 는 반사 로 데이터베이스 데모 동적 전환:
    새 라 이브 러 리 항목 My.sql.IDal 을 만 들 고 인터페이스 ISqlHelper 를 추가 합 니 다.인 터 페 이 스 를 통 해 데이터 베 이 스 를 조작 하 는 클래스 의 디 결합 을 실현 합 니 다.인 터 페 이 스 는 추상 적 이기 때 문 입 니 다.
    
      public interface ISqlHelper
      {
        string Query();
      }
    라 이브 러 리 항목 My.MySql.dal 을 추가 하고 클래스 MySqlHelper.cs 를 추가 합 니 다.
    My.sqlserver.dal,My.MySql.dal 항목 은 각각 항목 My.sql.IDal 에 대한 인용 을 추가 합 니 다.SqlServerHelper 로 하여 금 자체 인터페이스 ISqlHelper 를 계승 하 게 하 다
    
    public class MySqlHelper : ISqlHelper
      {
        public string Query()
        {
           return this.GetType().ToString();
        }
      }
      public class SqlServerHelper :ISqlHelper
      {
        private int age = 16;
        public string Name { get; set; }
        public string Query()
        {
          return this.GetType().ToString();
        }
      }
    App.config 설정 추가
    
     <appSettings>
      <add key="DBName" value="My.Sqlserver.Dal,SqlServerHelper"/>
     </appSettings>
    Reflected Demo 프로젝트 에서 Program.cs 호출 코드:
    
    string str = ConfigurationManager.AppSettings["DBName"];
          string strAssembly = str.Split(',')[0];
          string strClass=str.Split(',')[1];
          Assembly assembly = Assembly.Load(strAssembly);
          Type t = assembly.GetType(strAssembly + "." + strClass);
          ISqlHelper obj = Activator.CreateInstance(t) as ISqlHelper;
          Console.WriteLine(obj.Query());

    이렇게 하면 데이터 베 이 스 를 전환 해 야 할 때마다 프로필 만 수정 하면 된다.
    프로젝트 구성:

    주의:반사 가 강하 지만 성능 이 소모 되 기 때문에 캐 시 와 결합 하여 사용 합 니 다.
    프로젝트 원본:ReflectedDemo.zip
    이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기