C# 反射類Assembly 程序集(Assembly)用法

常見的兩種程序集:
可執行文件(.exe文件)和 類庫文件(.dll文件)。
在VS開發環境中,一個解決方案可以包含多個項目,而每個項目就是一個程序集。

他們之間是一種從屬關系,也就是說,一個AppDomain能夠包括N個Assembly,一個Assembly能夠包括N個Module,一個Module能夠包括N個Type,一個Type能夠包括N個成員。他們都在System.Reflection命名空間下。【公共語言運行庫CLR】加載器 管理 應用程序域,這種管理包括 將每個程序集加載到相應的應用程序域 以及 控制每個程序集中類型層次結構的內存布局。

模塊是可移植的可執行文件,例如 type.dll 或 application.exe,由一個或多個類和接口組成。 單個模塊可包含多個命名空間,而一個命名空間可跨越多個模塊。

Assembly介紹
Assembly類即程序集類,用來加載其他程序集,加載后可以用Type來使用其他程序集中的信息,如果想要使用其它程序集中的內容,需要先加載程序集。

加載程序集的三種方法:

①、一般用來加載同一文件下的其他程序集

Assembly assembly = Assembly.Load(“AssemblyName”);

②、一般用來加載不再同一文件下的其他程序集

Assembly assembly = Assembly.LoadFrom(“包含程序集清單的文件的名稱或路徑”);

Assembly assembly = Assembly.LoadFile(“要加載的文件的完全限定路徑”);

使用方法:

Assembly asm = Assembly.LoadFrom("Demo.dll");//需要加后綴,可以指定路徑,如:Assembly.LoadFrom(@"C:\Users\majm\source\repos\ConsoleApp29\bin\Debug\TestDll.dll");

Assembly asm = Assembly.Load("Demo");//無需加后綴,不可以指定路徑,

使用Load可以加載當前程序bin目錄行下的程序集或者系統程序集

定義數據模型:創建類庫并生成dll

 
namespace TestDll
{public class Person{public Person(){Name = "zls";Age = 18;id = 20;}public Person(string name, int age){Name = name;Age = age;id = 21;}public string Name { get; set; }public int Age { get; set; }public int id;public int Score(int a, int b){return a + b;}}
}

Assembly assembly = Assembly.LoadFrom(@"F:\2025\study\CsAssembly\TestDll\bin\Debug\TestDll.dll");
Type[] types = assembly.GetTypes();
for (int i = 0; i < types.Length; i++)
{Console.WriteLine(types[i]);
}

運行結果:

第二步:加載程序集中類對象:并調用方法傳入參數

 Type c1 = types[1];object obj = Activator.CreateInstance(c1);//調用Class1類中的Speak方法MethodInfo speak = c1.GetMethod("Score");object[] o = new Object[2] { 12, 13 };var result = speak.Invoke(obj, o);Console.WriteLine(result);

運行結果:25

這里還可以這樣如下去創建實例:(未驗證)

 Type c1 = types[0];Assembly asm = Assembly.GetAssembly(c1);Person person = (Person)asm.CreateInstance("TestDll.Person", true);//true:不區分大小寫//調用Person1類中的Score方法MethodInfo speak = c1.GetMethod("Score");object[] o = new Object[2] {12,13 };var result = speak.Invoke(person, o);Console.WriteLine(result);

一樣的效果,如果是當前程序集,可以GetExecutingAssembly獲取程序集

 Assembly asm = Assembly.GetExecutingAssembly();

二、Assembly程序集對象

1.獲得當前對象所屬的類所在的程序集

 this.GetType().Assembly;

2.根據路徑加載程序集

 Assembly.LoadFrom(assPath);

3.獲得當前【應用程序域】中的所有程序集

 Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();foreach(Assembly assembly2 in ass){MessageBox.Show($"assembly={assembly2}");}

三、Type類型對象

1.獲得程序集中定義的所有的public類

2.獲得程序集中定義的所有的類

//獲得程序集中定義的所有的public類Type[] allPublicTypes = ass1.GetExportedTypes();
//獲得程序集中定義的所有的類Type[] allTypes = ass1.GetTypes();

?3.用assembly對象,通過類的full name類獲得type對象

Assembly ass1 = Assembly.LoadFrom(@"F:\2025\study\CsAssembly\TestDll\bin\Debug\TestDll.dll");
//GetType的參數一定要是full name的string
Type tStu = ass1.GetType("TestDll.Student"); 
//Activator通過類型創建實體
object stu1 = Activator.CreateInstance(tStu);

?//強制轉換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/bicheng/20929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20929.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java —— 匿名內部類與 Lambda 表達式

一、匿名內部類 匿名內部類是一種沒有名稱的類&#xff0c;多用于只使用一次的情況&#xff0c;本質上就是其所繼承的父類或接口的一個子類。 &#xff08;一&#xff09;繼承普通類的情況 public class Test{public void method(){System.out.println("通用方法"…

Python與Android連接:深入探索與實現

Python與Android連接&#xff1a;深入探索與實現 在現代移動應用開發領域&#xff0c;Python和Android的結合使用為開發者帶來了無限的可能性。這種跨平臺的組合不僅拓寬了開發者的視野&#xff0c;也極大地提升了應用的靈活性和可擴展性。本文將從四個方面、五個方面、六個方…

【NLP開發】Python實現聊天機器人(微信機器人)

&#x1f37a;NLP開發系列相關文章編寫如下&#x1f37a;&#xff1a;1&#x1f388;【小沐學NLP】Python實現詞云圖&#x1f388;2&#x1f388;【小沐學NLP】Python實現圖片文字識別&#x1f388;3&#x1f388;【小沐學NLP】Python實現中文、英文分詞&#x1f388;4&#x1…

轉讓北京電力施工總承包二級資質變更條件和流程

在電力工程領域&#xff0c;資質等級是企業能否參與競標、承接工程的重要標志之一。北京電力工程總包二級資質的轉讓&#xff0c;是指已經取得該資質的企業將其資質轉讓給需要的企業。這種轉讓是基于合作與共贏的原則&#xff0c;旨在推動電力工程行業健康、穩定發展&#xff0…

記錄使用自定義編輯器做試題識別功能

習慣了將解析寫在代碼注釋&#xff0c;這里就直接上代碼啦&#xff0c;里面用到的bxm-ui3組件庫是博主基于element-Plus做的&#xff0c;可以通過npm i bxm-ui3自行安裝使用 // 識別方法&#xff1a; // dom 當前識別數據所在區域, questionType 當前點擊編輯選擇的題目類型&a…

力扣刷題--LCR 135. 報數【簡單】

題目描述 實現一個十進制數字報數程序&#xff0c;請按照數字從小到大的順序返回一個整數數列&#xff0c;該數列從數字 1 開始&#xff0c;到最大的正整數 cnt 位數字結束。 示例 1: 輸入&#xff1a;cnt 2 輸出&#xff1a;[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,1…

codeblock怎么編程:從入門到精通的全面指南

codeblock怎么編程&#xff1a;從入門到精通的全面指南 在數字化時代&#xff0c;編程已成為一項不可或缺的技能。Code::Blocks作為一款流行的開源集成開發環境&#xff08;IDE&#xff09;&#xff0c;為初學者和有經驗的開發者提供了強大的編程支持。那么&#xff0c;codebl…

C是結構化編程語言嗎:深度剖析與多維度解讀

C是結構化編程語言嗎&#xff1a;深度剖析與多維度解讀 在編程語言的浩瀚海洋中&#xff0c;C語言以其獨特的魅力占據著重要的地位。那么&#xff0c;C語言是否可以被歸類為結構化編程語言呢&#xff1f;這是一個值得深入探討的問題。本文將從四個方面、五個方面、六個方面和七…

Qt | Qt 資源簡介(rcc、qmake)

1、資源系統是一種獨立于平臺的機制,用于在應用程序的可執行文件中存儲二進制文件(前面所討論的數據都存儲在外部設備中)。若應用程序始終需要一組特定的文件(比如圖標),則非常有用。 2、資源系統基于 qmake,rcc(Qt 的資源編譯器,用于把資源轉換為 C++代碼)和 QFile …

java—MyBatis框架

簡介 什么是 MyBatis&#xff1f; MyBatis 是一款優秀的持久層框架&#xff0c;它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO&…

軟件公司為什么必須要使用低代碼系統?

在當今軟件行業全國比較內卷的大環境下&#xff0c;軟件公司面臨著前所未有的挑戰。為了在這個競爭激烈的市場中生存并脫穎而出&#xff0c;馳騁低代碼設計者認為&#xff0c;軟件公司必須要使用低代碼系統。以下是幾個關鍵的原因&#xff1a; 時代發展的必然選擇 低代碼系統是…

領導力中的說服藝術

本文主要介紹了亞里士多德修辭三角理論&#xff0c;即演講者在說服聽眾時如何運用品格&#xff08;Ethos&#xff09;、情感&#xff08;Pathos&#xff09;和邏輯&#xff08;Logos&#xff09;三種基本的修辭手法。原文: The Art of Persuasion in Leadership 亞里士多德的說…

Kubernetes面試題分享

目錄 前言 1.Kubernetes的控制平面包括哪些核心組件&#xff1f;它們各自的作用是什么&#xff1f; 2.Kubernetes的數據平面涉及哪些組件&#xff1f;它們如何協作&#xff1f; 3.什么是Pod&#xff1f;為什么它是Kubernetes的基本單元&#xff1f; 4.Service如何實現服務…

【自動駕駛技術】自動駕駛汽車AI芯片匯總——地平線篇

0. 前言 按照國際慣例&#xff0c;首先聲明&#xff1a;本文只是我自己學習的理解&#xff0c;雖然參考了他人的寶貴見解及成果&#xff0c;但是內容可能存在不準確的地方。如果發現文中錯誤&#xff0c;希望批評指正&#xff0c;共同進步。 本篇文章是這個系列的第二篇&#x…

[AIGC] DAG任務調度的概述與實踐

DAG(Directed Acyclic Graph&#xff0c;有向無環圖)作為任務調度的基礎模型&#xff0c;在大規模數據處理和計算過程中有著廣泛的應用。本文將對DAG模型的原理進行解釋并列出一些常用的任務調度工具。 文章目錄 一、什么是DAG&#xff1f;二、DAG任務調度的原理三、常用的DAG任…

50個常用的Docker命令及如何使用

這里整理了50個常用的Docker命令以及每個命令的使用方法。 docker version:顯示Docker版本信息。 示例:docker version docker info:顯示Docker系統信息。 示例:docker info docker pull <image>:從Docker Hub下載鏡像。 示例:docker pull ubuntu docker run <i…

spring xml配置文件中的bean標簽屬性

概述 在Spring框架中&#xff0c; 標簽用于定義和配置 Spring 容器管理的對象&#xff08;即 bean&#xff09;。 標簽有許多屬性&#xff0c;每個屬性都用來配置 bean 的特定方面。下面是一些主要屬性及其默認值的詳細說明。 屬性 1 id 說明: 用于標識 bean 的唯一標識符。…

一文帶你了解python

一文帶你了解python 簡單介紹 python是腳本語言,不需要在使用變量前進行聲明,代碼不需要編譯,由解釋器來解釋執行。python簡潔的語法可以讓你寫出比靜態語言更短的程序。使用交互式解釋器時,會自動打印輸入的一些包含值的東西;在非交互式的程序中,需要使用print函數打印…

Python獲取文件MD5值方法

Python的標準庫中提供了一個名為hashlib的模塊&#xff0c;可以用來生成MD5值。 下面是兩個方法的實現&#xff1a; 1. 通過文件路徑獲取MD5值&#xff1a; import hashlibdef calculate_md5_file(file_path):md5 hashlib.md5()with open(file_path, "rb") as f:…

啟發式算法教程(個人總結版)

1. 引言 1.1 什么是啟發式算法 啟發式算法是一類用于尋找復雜優化問題近似解的方法&#xff0c;特別適用于在計算資源有限的情況下求解大型問題。與精確算法不同&#xff0c;啟發式算法不保證找到全局最優解&#xff0c;但能在可接受的時間內提供一個質量較高的解。 1.2 啟發…