C\#프로그램 집합 과 반사 상세 설명
반 사 를 말 하기 전에 프로그램 집합 이 무엇 인지 알 아 보 겠 습 니 다.
프로그램 집합
프로그램 집합 은.net 의 개념 으로 프로그램 집합 은 관련 클래스 에 가방 을 싸 는 것 으로 볼 수 있 으 며 자바 의 jar 가방 에 해당 합 니 다.
프로그램 집합 포함:
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 클래스 에는 세 가지 방법 이 있 습 니 다.
그들 이 자주 사용 하 는 이 유 는 우리 가 반 사 를 통 해 얻 을 수 있 는 것 이 너무 많아 서 우 리 는 데 이 터 를 여과 해 야 하기 때문이다.
클래스 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
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.