Module

Moduleは、モジュール情報を持つオブジェクト。

Module Class (System.Reflection) | Microsoft Docs

もうちょっといろいろな情報を出してみる。

空のプロジェクト
空のプロジェクト

空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.cs。

出来る限りプロパティを出力してみる。

DLLを置く
DLLを置く

DLLを置く。

Releaseも同様に
Releaseも同様に

Releaseも同様に。

asm = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
mod = ClassLibrary.dll
mod.Assembly = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=nu
ll
mod.FullyQualifiedName = C:\Project\Cloud\github.com\Sample\dotnet\Module\Module
\src\Module_\Module_\bin\Release\ClassLibrary.dll
mod.MDStreamVersion = 131072
mod.MetadataToken = 1
mod.ModuleHandle = System.ModuleHandle
mod.ModuleVersionId = 5c033775-b5c3-4201-9406-1587ae82e910
mod.Name = ClassLibrary.dll
mod.ScopeName = ClassLibrary.dll
続行するには何かキーを押してください . . .

とりあえずこんだけ出た。

Sample/dotnet/Module/Module/src/Module_ at master · bg1bgst333/Sample · GitHub

Assembly.GetModule

Assembly.GetModuleは、モジュール情報を取得する。

Assembly.GetModule(String) Method (System.Reflection) | Microsoft Docs

アセンブリとモジュールがどう違うのかについては、

解説:インサイド .NET Framework 第1回 Managed Code/アセンブリ/モジュール(5/5) - @IT
インサイド .NET Framework [改訂版]第1回 マネージ・コード/アセンブリ/モジュール(4/5) - @IT

ここのをみて、なるほどと思った。
VBC++のライブラリとマージする時に関係してくるらしい。

空のプロジェクト
空のプロジェクト

空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.cs。

asm.GetModuleでModuleオブジェクトmodを取得。

DLLを置く
DLLを置く

DLLを置く。

Releaseも同様に
Releaseも同様に

Releaseも同様に。

asm = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
mod = ClassLibrary.dll
続行するには何かキーを押してください . . .

DLLのファイル名だけ。

Sample/dotnet/Assembly/GetModule/src/Assembly_ at master · bg1bgst333/Sample · GitHub

Assembly.Load

Assembly.Loadも、アセンブリをロードするメソッド。

Assembly.Load Method (System.Reflection) | Microsoft Docs

".dll"を省略できたり、完全限定名を指定してロードできる。

空のプロジェクト
空のプロジェクト

空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.cs。

"ClassLibrary"だけでロードしてみる。

DLLはEXEと同じ場所
DLLはEXEと同じ場所

DLLはEXEと同じ場所。

asm1 = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
続行するには何かキーを押してください . . .

こうなる。
完全限定名での指定もできるが、LoadFileで絶対パスの指定ができるので、絶対パスが違う時点で完全限定名での区別が必要なケースってどういうのだろうとおもった。

Sample/dotnet/Assembly/Load/src/Assembly_ at master · bg1bgst333/Sample · GitHub

Assembly.LoadFile

Assembly.LoadFileでも、アセンブリをロードできる。

Assembly.LoadFile Method (System.Reflection) | Microsoft Docs
.NETアセンブリでのLoadFileとLoadFromの違い - コードログ

LoadFileは絶対パスを指定する。
同じdllでもパスの位置が違うファイルと区別される模様。

空のプロジェクト
空のプロジェクト

空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.cs。

Lib1フォルダ作成
Lib1フォルダ作成

Lib1フォルダ作成。

DLLを置く
DLLを置く

DLLを置く。

Lib2作成
Lib2作成

Lib2作成。

そこにも置く
そこにも置く

そこにも置く。

実際には、それぞれのDLLを置いた場所の絶対パスを指定する。

asm1 = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
asm2 = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
asm1.CodeBase != asm2.CodeBase
続行するには何かキーを押してください . . .

CodeBaseが違うということは場所が違うということ。

Sample/dotnet/Assembly/LoadFile/src/Assembly_ at master · bg1bgst333/Sample · GitHub

Assembly.LoadFrom

Assembly.LoadFromで、指定のDLLやEXEのアセンブリをロードする。

Assembly.LoadFrom Method (System.Reflection) | Microsoft Docs
動的にDLLファイルのクラスメソッドを呼び出す (Reflectionを用いたアセンブリの動的呼び出し) (C#プログラミング)

空のプロジェクト
空のプロジェクト

空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.cs。

DLLのファイル名だけ指定。

EXEと同じ場所に置く
EXEと同じ場所に置く

EXEと同じ場所に置く。

Releaseも同様に
Releaseも同様に

Releaseも同様に。

asm = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
続行するには何かキーを押してください . . .

このようにアセンブリ情報が出る。

Sample/dotnet/Assembly/LoadFrom/src/Assembly_ at master · bg1bgst333/Sample · GitHub

Assembly

Assemblyクラスは、クラスライブラリや実行ファイルなどのアセンブリ情報を持つ。

Assembly Class (System.Reflection) | Microsoft Docs

空のプロジェクト
空のプロジェクト

空のプロジェクト。

MainClass.cs
MainClass.cs

MainClass.cs。

DLLを置く
DLLを置く

プロジェクトファイルと同じ場所に、DLLを置く。

参照の追加
参照の追加

参照の追加で、

ClassLibrary.dllを選択
ClassLibrary.dllを選択

ClassLibrary.dllを選択。

typeofでClassLibraryClassのTypeであるtypeを取得したら、type.AssemblyでAssemblyオブジェクトasmを取得。

asm = ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
続行するには何かキーを押してください . . .

asmの中身はアセンブリ情報。

Sample/dotnet/Assembly/Assembly/src/Assembly_ at master · bg1bgst333/Sample · GitHub

DllImportAttribute

DllImportAttributeは、C++などで書かれた外部ライブラリ(DLL)のメソッドを宣言する時に付ける属性。

DllImportAttribute Class (System.Runtime.InteropServices) | Microsoft Docs

MessageBoxなど、ANSI関数とUnicode関数が別れている場合は、呼び出す関数によっては文字コードを指定しておかないと文字化けの可能性がある。

空のプロジェクト
空のプロジェクト

空のプロジェクトで、

MainClass.cs
MainClass.cs

MainClass.csを追加。

MessageBoxWを呼び出す。

MessageBox function (winuser.h) | Microsoft Docs

Unicode関数なので、CharSetにCharSet.Unicodeを指定。
hWndはIntPtrに、LPCWSTRはstringに、UINTはuintに。

MessageBoxWが表示される
MessageBoxWが表示される

MessageBoxWが表示される。

終了
終了

そして終了。

Sample/dotnet/DllImportAttribute/DllImportAttribute/src/DllImportAttribute_ at master · bg1bgst333/Sample · GitHub