GetActiveObjectメソッドと同等の機能を.Net Core 8.0で実装する

はじめに

.NET Frameworkでは、System.Runtime.InteropServices.MarshalクラスのGetActiveObjectメソッドを使用して、既に実行中のCOMオブジェクトを取得することができました。

このメソッドは、指定されたクラス識別子(CLSID)に基づいて、実行中のCOMオブジェクトへの参照を取得する便利な機能を提供していました。

しかし、.NET Coreに移行すると、このメソッドは提供されておらず、開発者は代替手段を見つける必要があります。

.NET Coreは、クロスプラットフォームの互換性とパフォーマンスの向上を重視して設計されていますが、その結果として一部のAPIが削除されたり変更されたりしています。

GetActiveObjectメソッドもその一つで、.NET Coreでは直接利用することができません。このため、.NET Core 8.0で同様の機能を実現するには、P/Invoke(※)を使用してWindows APIのGetActiveObject関数を呼び出す必要があります。

この記事では、.NET Core 8.0でGetActiveObjectメソッドと同等の機能を実装する方法を詳しく解説します。具体的なコード例を通じて、P/Invokeを使用してCOMオブジェクトを取得する手順を示し、開発者がスムーズに.NET Coreへの移行を行えるようサポートします。

※P/Invoke…P/Invoke(Platform Invocation Services)とは、.NETアプリケーションからネイティブのアンマネージコード(主にCやC++で書かれたDLL)を呼び出すための機能です。これにより、.NETのマネージコードからWindows APIや他のネイティブライブラリの関数を利用することが可能になります。

前提条件

・開発ツール:VisualStudio2022

・開発言語:C#

・.Net FrameWorkから.Net Coreへの移行が完了している(詳しくはこちら)

現象

.Net FrameWork 4.8で作成されていたプロジェクトファイルを.Net Core 8.0へ移行してからビルドした際、「MarshalクラスにGetActiveObjectは存在しない」というエラーが発生した。

解決策

エラーが起きているプロジェクト内に新たな.csファイルを作成し、以下コードを書きます。

新たなファイルはここではPInvoke.csとします。

using System;
using System.Runtime.InteropServices;

namespace TQ84 {

   public class COM {

     [DllImport("oleaut32.dll", PreserveSig=false)]
      static extern void GetActiveObject(
                                            ref Guid   rclsid,
                                                IntPtr pvReserved,
        [MarshalAs(UnmanagedType.IUnknown)] out Object ppunk
      );

     [DllImport("ole32.dll")]
      static extern int CLSIDFromProgID(
         [MarshalAs(UnmanagedType.LPWStr)]      string lpszProgID,
                                            out Guid   pclsid
      );

      public static object getActiveObject(string progId) {
         Guid clsid;
         CLSIDFromProgID(progId, out clsid);

         object obj;
         GetActiveObject(ref clsid, IntPtr.Zero, out obj);

         return obj;
      }
   }
}

コード説明

①GetActiveObject関数の定義

 
 [DllImport("oleaut32.dll", PreserveSig=false)]
      static extern void GetActiveObject(
                                            ref Guid   rclsid,
                                                IntPtr pvReserved,
        [MarshalAs(UnmanagedType.IUnknown)] out Object ppunk
      );

  • DllImport属性を使用して、oleaut32.dllからGetActiveObject関数をインポートしています。
  • PreserveSig=falseは、メソッドがHRESULTを返さずに、例外をスローすることを指定しています。
  • 関数の引数は、CLSIDを参照渡しし、pvReservedには予約されているIntPtrを渡します。
  • 最後の引数は、IUnknownとしてマーシャリングされたオブジェクトをアウトパラメータとして取得します。

②CLSIDFromProgID関数の定義


 [DllImport("ole32.dll")]
       static extern int CLSIDFromProgID(
          [MarshalAs(UnmanagedType.LPWStr)]      string lpszProgID,
                                            out Guid   pclsid
       );
  • DllImport属性を使用して、ole32.dllからCLSIDFromProgID関数をインポートしています。
  • 関数の引数は、LPWStrとしてマーシャリングされたProgID(プログラム識別子)と、CLSIDをアウトパラメータとして取得します。

➂getActiveObjectメソッドの定義


 public static object getActiveObject(string progId) {
          Guid clsid;
          CLSIDFromProgID(progId, out clsid);

          object obj;
          GetActiveObject(ref clsid, IntPtr.Zero, out obj);

          return obj;
       }
    }

  • getActiveObjectメソッドは、指定されたProgIDを基に実行中のCOMオブジェクトを取得します。
  • まず、CLSIDFromProgID関数を使用してProgIDをCLSIDに変換します。
  • 次に、GetActiveObject関数を使用して、取得したCLSIDに基づいて実行中のCOMオブジェクトを取得します。
  • 最後に、取得したCOMオブジェクトを返します。

まとめ

.NET CoreでGetActiveObjectメソッドを使用するためには、P/Invokeを使用してWindows APIを呼び出す必要があります。これにより、.NET Core環境でも既に実行中のCOMオブジェクトを取得することが可能です。

オンラインでコスパよく勉強するならこれ!

「新しいスキルを学びたいけれど、まとまった時間が取れない…」そんな悩みを持つ方にぴったりの選択肢が、オンライン学習です。プログラミングからデザイン、ビジネススキルまで、幅広い講座が揃う学習プラットフォームが注目されています。

このプラットフォームは、講師と学びたい人をつなぐ場として、多くの受講生が世界中から利用しています。さまざまなジャンルの講座があり、自分のペースで学習を進められるのが大きな特徴です。


いつでも学べる、オンライン学習の魅力

1. 世界中で利用される大規模プラットフォーム

このオンライン学習サービスは、世界中で多くの人に利用されています。13のカテゴリと21万以上のコースが揃い、フィットネスやマーケティング、音楽など、ITスキルだけでなく多岐にわたるジャンルから学びたい内容を見つけられます。例えば「Pythonを学びたい」といった具体的な目的があれば、すぐに適した講座が見つかりますし、トレンドに沿った最新のテーマにも簡単にアクセスできます。

2. 買い切り型で視聴期限なし

講座は一度購入すれば、視聴期限なしでいつでも見返すことができる買い切り型。忙しい日々の中でも、自分のペースで学びを進められます。価格は1万円前後が多いですが、質の高い講座が多く、投資する価値を感じられる内容です。

また、講師に質問できる機能もあり、疑問点を解消しながら進められるので、オンラインでも対面のような学習体験が可能です。

3. 無料講座も充実

基本的には有料講座が中心ですが、無料で学べるコンテンツも多数あります。例えば、「Web開発」の分野では、無料で視聴できる講座だけでも多く見つかります。これらの無料講座も評価が高く、安心して学べる内容が揃っています。

さらに、初めて利用する方には割引キャンペーンやセールが行われることもあり、高額な講座が特別価格で提供されることも。気になる講座を手頃な価格で試せるチャンスです。

3つのメリット

オンライン学習を活用する際の、特に魅力的な点を3つご紹介します。

メリット1. 高評価の講座が豊富

「JavaScript」などの人気分野では、評価が4.0以上の講座が多数揃っており、安心して学び始めることができます。質の高い講座が多く、選ぶ際に失敗しにくいのが嬉しいポイントです。

メリット2. 購入前に試し視聴ができる

講座はセクションごとに構成されており、一部の内容は購入前に無料でプレビュー視聴可能。講師の話し方や講座の進め方を事前に確認できるので、自分に合った講座を見つけやすくなっています。

メリット3. 口コミを参考に選べる

講座ごとに視聴者からの口コミや評価が掲載されており、実際に受講した人の意見を参考にできます。「初心者でも分かりやすい」「実践的な内容」など、レビューを参考にして、自分の目的に合った講座を選ぶのに役立ちます。

まとめ

オンライン学習は、忙しい中でもスキルアップを目指せる手軽な方法です。高品質な講座が豊富に揃い、自由なタイミングで学べるのが魅力。まずは無料の講座やお得なセールを活用し、自分に合った学びを見つけてみてください!