この記事では主にC#のアセンブリとリフレクションに関する知識を紹介します。一定の基準値があるので、編集者と一緒に見てみましょう
ここでさらに一言言います。本を読んだり、ビデオを見たりするとき、誰もがとても楽しいと感じます。実際、それを理解することと、自分でそれを言えるようになるのは別のことです。他人の真似をするのではなく、学んだことを自分のものにしていく必要があります。
リフレクションについて話す前に、まずアセンブリとは何なのかを理解しましょう。
Assembly
Assembly は、.net の概念であり、Java の jar パッケージに相当する、一連の関連クラスのパッケージと見なされます。
アセンブリには以下が含まれます:
リソース ファイル
型メタデータ (コード内で定義された各型とメンバーをバイナリ形式で説明)
IL コード (これらは exe または dll 媒体にパッケージ化されています)
exeとdllの違い。
exeは実行できますが、exe内にmain関数(エントリ関数)があるため、dllを直接実行することはできません。
タイプ メタデータ この情報は、AssemblyInfo.cs ファイルを通じてカスタマイズできます。すべての .net プロジェクトには AssemblyInfo.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 クライアント プログラムをインストールすると、インストール ディレクトリの下に多くのアセンブリ ファイルが表示されます。
アセンブリを使用する利点
- プログラム内で必要なアセンブリのみが参照されるため、プログラムのサイズが削減されます。
- アセンブリは一部のコードをカプセル化し、必要なアクセス インターフェイスのみを提供できます。
- 簡単に拡張できます。
アセンブリ パスを直接追加するか、ソリューションにプロジェクト参照を追加します。
プログラムを拡張する必要がある場合、元のプロジェクトに直接追加できます。この場合、コードを他の人と共有したい場合はどうすればよいでしょうか。これをアセンブリにパッケージ化すると、他のユーザーがアセンブリを参照して拡張できます。 log4net、unity などの一般的な .net サードパーティ
framework注: 循環参照の追加とは何ですか?つまり、プロジェクト A がプロジェクト B にプロジェクト参照を追加する場合、現時点ではプロジェクト B はプロジェクト A にプロジェクト参照を追加できません。つまり、プロジェクト参照を追加する場合は、次のように一方向である必要があります。共通の 3 層プロジェクトの参照。リフレクション
リフレクションについては、.net開発を行っている限り、毎日使用する必要があります。 VS のスマート プロンプトは、リフレクション テクノロジと、一般的に使用される逆コンパイル アーティファクト Reflector.exe を適用して実装されているため、その名前からわかります。プロジェクトでは、データベース インスタンスの切り替えや、構成ファイルによる Sprint.net の依存関係注入など、構成ファイルを組み合わせてオブジェクトを動的にインスタンス化することがより一般的です。
Reflection テクノロジは、実際にはアセンブリのメタデータを動的に取得し、DLL を解析してオブジェクトを作成し、メンバーを呼び出す機能です。
Type はクラスの説明です。Type クラスは、メソッド、属性などを含むクラス内のすべての情報を取得できる、リフレクションを実装するための重要なクラスです。クラスのプロパティとメソッドを動的に呼び出すことができます。
過去にはオブジェクトは新しいものを通じて直接作成されていたため、リフレクションの出現によりオブジェクトの作成方法が変わりました。
DLL には、IL 中間言語とメタデータ要素データの 2 つの部分があります。
.NET でリフレクションに使用される
名前空間は、System.Reflection です。ここでは、最初にデモを使用してリフレクションで何ができるかを確認します 1. 新しいコンソール プロジェクト ReflectedDemo を作成します
2. 新しい
クラス ライブラリを作成します。プロジェクトMy.Sqlserver.DalSqlServerHelperとSqlCmdの2つの新しいクラスを作成します。前者はパブリッククラスであり、後者はプライベートクラスです
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. My.Sqlserver.Dalのプロジェクト参照を追加します。この目的は、My.Sqlserver.Dal.dll アセンブリが常に ReflectedDemo プロジェクトの bin ディレクトリに存在すると便利です。
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.CreateInstance(string typeName) 和Activator.CreateInstance(Type t)方法 他们之间的区别 ass.CreateInstance(string typeName) 会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果没有无参构造函数就会报错。 如果我们来修改SqlServerHelper类的代码,添加如下构造函数: 这个时候再来运行创建实例的代码就会报错了,而编译时是不报错的。 所以我们一般推荐使用Activator.CreateInstance方法来创建反射对象,因为此方法有许多重载,支持将参数传递给构造函数。 此时再调用就不会出现异常了。 Type类中有三个用得比较多的方法: bool IsAssignableFrom(Type t):是否可以从t赋值,判断当前的类型变量是不是可以接受t类型变量的赋值。 bool IsInstanceOfType(object o):判断对象o是否是当前类的实例,当前类可以是o的类、父类、接口 bool IsSubclassOf(Type t):判断当前类是否是t的子类 Type类中还有一个IsAbstract属性:判断是否为抽象的,包含接口。 它们常用的原因是我们通过反射可以取到的东西太多了,我们需要对数据进行过滤。 添加类BaseSql,让类SqlServerHelper继承自BaseSql 然后查看调用代码: 项目中常用的利用反射来动态切换数据库Demo: 新建类库项目My.Sql.IDal,并添加接口ISqlHelper。通过接口来实现数据库操作的类的解耦,因为接口是抽象的。 添加类库项目My.MySql.Dal,并新增类MySqlHelper.cs My.Sqlserver.Dal、My.MySql.Dal项目分别添加对项目My.Sql.IDal的引用。让SqlServerHelper继承自接口ISqlHelper 添加App.config配置项 ReflectedDemo项目中Program.cs调用代码: 这样每次需要切换数据库时,只要修改配置文件就可以了。 项目结构: 注意:反射虽然很强大,但却是比较耗性能的,所以一般和缓存结合起来使用。Assembly assembly = Assembly.Load("My.Sqlserver.Dal");
object obj = assembly.CreateInstance("My.Sqlserver.Dal.SqlServerHelper");
Console.WriteLine(obj.GetType().ToString());
public SqlServerHelper(int age)
{
this.age = age;
}
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);
public interface ISqlHelper
{
string Query();
}
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();
}
}
<appSettings>
<add key="DBName" value="My.Sqlserver.Dal,SqlServerHelper"/>
</appSettings>
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());
以上がC#アセンブリとリフレクションのグラフィックコードを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

C#と.NETは、強力な機能と効率的な開発環境を提供します。 1)C#は、CのパワーとJavaのシンプルさを組み合わせた最新のオブジェクト指向プログラミング言語です。 2).NETフレームワークは、複数のプログラミング言語をサポートするアプリケーションを構築および実行するためのプラットフォームです。 3)C#のクラスとオブジェクトは、オブジェクト指向プログラミングの中核です。クラスはデータと動作を定義し、オブジェクトはクラスのインスタンスです。 4).NETのゴミ収集メカニズムは、開発者の作業を簡素化するためにメモリを自動的に管理します。 5)C#および.NETは、同期および非同期プログラミングをサポートする強力なファイル操作関数を提供します。 6)一般的なエラーは、デバッガー、ロギング、例外処理を通じて解決できます。 7)パフォーマンスの最適化とベストプラクティスには、StringBuildの使用が含まれます

.NetFrameworkは、一貫したプログラミングモデルと強力なランタイム環境を提供する、クロス言語のクロスプラットフォーム開発プラットフォームです。 1)メモリとスレッドを管理するCLRとFCLで構成され、FCLは事前に構築された機能を提供します。 2)使用の例には、読み取りファイルとLINQクエリが含まれます。 3)一般的なエラーには、未処理の例外とメモリリークが含まれ、デバッグツールを使用して解決する必要があります。 4)パフォーマンスの最適化は、非同期プログラミングとキャッシュを通じて実現でき、コードの読みやすさと保守性を維持することが重要です。

C#.NETが永続的に魅力的なままである理由には、その優れたパフォーマンス、リッチエコシステム、強力なコミュニティサポート、クロスプラットフォーム開発機能が含まれます。 1)優れたパフォーマンスであり、エンタープライズレベルのアプリケーションとゲーム開発に適しています。 2).NETフレームワークは、さまざまな開発分野をサポートするための幅広いクラスライブラリとツールを提供します。 3)アクティブな開発者コミュニティと豊富な学習リソースがあります。 4).NetCoreは、クロスプラットフォーム開発を実現し、アプリケーションシナリオを拡張します。

C#.NETの設計パターンには、Singletonパターンと依存関係の注入が含まれます。 1.シングルトンモードは、クラスに1つのインスタンスしかないことを保証します。これは、グローバルアクセスポイントが必要なシナリオに適していますが、安全性と虐待の問題をスレッドすることに注意する必要があります。 2。依存関係の噴射により、依存関係を注入することにより、コードの柔軟性とテスト可能性が向上します。多くの場合、コンストラクターの注入に使用されますが、複雑さを高めるために過度の使用を避ける必要があります。

C#.NETは、ゲーム開発、金融サービス、モノのインターネット、クラウドコンピューティングの分野で現代世界で広く使用されています。 1)ゲーム開発では、C#を使用してUnityエンジンを介してプログラムします。 2)金融サービスの分野では、C#.NETが高性能取引システムとデータ分析ツールの開発に使用されます。 3)IoTおよびクラウドコンピューティングに関して、C#.NETはAzure Servicesを通じてサポートを提供して、デバイス制御ロジックとデータ処理を開発します。

.NETFRAMEWORKISWINDOWS-CENTRIC、while.netcore/5/6supportscross-platformdevelopment.1).netframework、2002年以来、isidealforwindowsprimitedincross-platformcapabilities.2).netcore、andtseverutions(andtseverutions(andtseverution)

C#.NET開発者コミュニティは、次のような豊富なリソースとサポートを提供します。1。Microsoftの公式文書、2。StackoverflowやRedditなどのコミュニティフォーラム、3。Githubのオープンソースプロジェクト。これらのリソースは、開発者が基本的な学習から高度なアプリケーションまでプログラミングスキルを向上させるのに役立ちます。

C#.NETの利点には以下が含まれます。1)非同期プログラミングなどの言語機能により、開発が簡素化されます。 2)パフォーマンスと信頼性、JITコンピレーションとゴミ収集メカニズムによる効率の向上。 3)クロスプラットフォームサポート、.NetCoreはアプリケーションシナリオを拡張します。 4)Webからデスクトップ、ゲーム開発までの優れたパフォーマンスを備えた幅広い実用的なアプリケーション。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

WebStorm Mac版
便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
