Skip to content

MS_DLLandCOMUser

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

DLL/COMユーザ

概要

DLL / COM ユーザとなりうる言語を纒めた。

言語 DLL COM .NET DLL
VB6/VBA DllImport CreateObject DLL/COM として作成・利用が可能
VBScript × CreateObject COM として作成・利用が可能
.NET DllImport COM 参照(RCW) .NET 参照で利用可能
PowerShell DllImport COM 参照(RCW) .NET 参照で利用可能
Java JNI/JNA JACOB? DLL/COM として作成・利用が可能
PHP × new COM dotnet_load(実験的実装)。.NET 参照で利用可能

※ .NET アセンブリは DLLCOM のインターフェイスを公開できる。

移行メモ(表の崩れ): 移行元の PHP 行の「.NET DLL」列は
dotnet_l.NET参照で利用可能:oad(実験的実装) という
文字列が混線した状態になっていた
dotnet_load(実験的実装).NET参照で利用可能 が入り混じっている)。
意味が通るよう dotnet_load(実験的実装)。.NET 参照で利用可能 と復元した。

補足(表の各セルの補足と、現在の状況): 表が簡潔なので、
実際に使う際の要点を補う。

【VB6 / VBA の「DllImport」について】★
   VB6 / VBA に DllImport 属性はない。
   正しくは【Declare ステートメント】である。
     Declare Function MessageBoxA Lib "user32" ( _
         ByVal hWnd As Long, ByVal lpText As String, _
         ByVal lpCaption As String, ByVal uType As Long) As Long

   ・64bit Office では【PtrSafe が必須】★
       Declare PtrSafe Function ... 
     → Long ではなく【LongPtr】を使う
     → 32bit Office 向けの既存コードは
       そのままでは動かない(VBA7 以降)
     → #If VBA7 Then / #If Win64 Then で分岐する
【VBScript の「×」(DLL を直接呼べない)】
   正しい。VBScript には Declare がない。
     → 回避策は
       ・COM ラッパーを作って CreateObject する
       ・【Windows Script Components(.wsc)】
       ・PowerShell に処理を委譲する
   ※ VBScript 自体が
     【Windows 11 で非推奨化され、順次削除】される ★
     → 詳細は [VBS](MS_VBS) を参照
【.NET / PowerShell の COM 参照(RCW)】★
   RCW = Runtime Callable Wrapper
     → COM オブジェクトを .NET から見せるラッパー
     → 参照追加すると Interop.Xxx.dll が生成される

   ・【dynamic を使うと Interop DLL 不要】★
       dynamic excel = Activator.CreateInstance(
           Type.GetTypeFromProgID("Excel.Application"));
     → 遅延バインディング。配布が楽になる
   ・【解放漏れに注意】
     → Marshal.ReleaseComObject / FinalReleaseComObject
     → Excel が【プロセスに残り続ける】典型原因

   ・.NET Core 以降
     → 【Windows 上でのみ】COM 相互運用が使える
     → 「型の埋め込み(Embed Interop Types)」が既定
【Java の「JACOB?」(疑問符付き)への回答】★
   JACOB(JAva COM Bridge)は実在し、
   現在も GitHub で保守されている(LGPL)。
     → ただし【JNI ベース】であり、
       32/64bit の DLL を環境に合わせて配る必要がある
   ・他の選択肢
       - Jawin(開発終了)
       - com4j(開発停滞)
       - 【JNA】★(JNI より宣言的。DLL 呼び出し向け)
       - 【Project Panama / FFM API】★
         → Java 22 で正式化。JNI の後継
         → 今から書くならこちら
【PHP の COM】
   ・COM / DOTNET クラスは【Windows 版 PHP 限定】
   ・PHP 8 でも利用可能だが、
     【DOTNET クラスは .NET Framework 前提】であり
     .NET Core 以降には追随していない ★
   → 実務では
     「PHP から .NET を呼ぶ」のではなく
     【HTTP API を挟む】方が確実
【表全体への現代的な読み替え】★
   この表が扱っているのは
   「【同一マシン上でバイナリ境界を越える】」手段である。

   現在の主流は
     ・【プロセスを分けて HTTP / gRPC で話す】
     ・【標準入出力でやり取りする】(CLI をラップ)
     ・【共有メモリ / 名前付きパイプ】(低遅延が要る場合)
   → バイナリ互換(ABI)に依存しないため
     32/64bit、ランタイム版、言語版の
     組み合わせ問題から解放される

参考

マネージドコード(.NET)のインターフェイスをアンマネージドコードに公開する方法

マネージドコードとアンマネージドコードのブリッジ
該当節を参照。


Tags: 移行, Windows, プログラミング, .NET開発

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally