weweaaa
12/27/2019 - 2:52 PM

DCOM 學習心得.md

COM+ 研究紀錄


快速理解 COM 是什麼

  • COM 元件

    • 具有公開屬性、方法、事件
    • 可以在應用程式中呼叫的二進位檔案
      • 具有保護 Source Code 的作用
      • 也因為已經編譯過,所以在執行速度上會比 ASP指令檔(Script) 來的更快
    • 在程式開發中可以重複使用此元件以提高開發效率降低成本
    • 如果應用程式想成一件產品,那麼元件就是組成此產品的零件
      • 此系統開發哲學就是 CBSEComponent Based System Engineering
        1. 定義應用程式的功能
        2. 設計使用者介面
        3. 查詢軟體元件目錄尋找符合功能的軟體元件
        4. 查詢各軟體元件的介面(interface)
        5. 撰寫應用程式組合各軟體元件
        6. 輸入各軟體元件的介面值
        7. 呼叫各軟體元件
        8. 完成系統功能。
    • 每個元件都可視為是一段獨立的副程式,讓應用程式透過 Run Time 時與元件的相互連結而完成系統功能
  • COM 是一套規範

    • 規定了製作具有動態交換能力元件的方法,制定了用戶端程式與及元件間溝通的介面
    • 包含以 Win32 動態連結程式庫( DLL )及以 .EXE 形式存在的可執行檔
    • 可以用二進位的格式傳送
    • 具有語言獨立性:可以使用任何語言撰寫,也可以呼叫任何語言的元件
    • 具位置透通性﹙location transparent﹚:用戶端程式可以將遠端機器上的元件當成本地端機器上的元件一樣使用
    • 與用戶端程式獨立:可以在不干擾舊有用戶端程式的前提下進行新物件的改版
    • COM 規定所有的介面都必須繼承 IUnknown介面,因此每個COM介面都一定包含三個函式
      • QueryInterface
      • AddRef
      • Release ![2](data:image/jpeg;base64,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BykkZR9VIrIRXA010XoulgSWZYUcgkF37l7OiVI4kGrOx0AogqwBBHpB+ROhnVN8xg6sF7tSOlt1I0LM3qCjUmr2O4UAElPQDV9HFM7oqRtrqTIQB03Mbww7/WSKd4DcGrd1XAmgmBMcgBAIBIPf8i6Es1lKI7lACOrc+g60wCgakms3bvMraFe0dHtvH/FHRMkUY72chRX+Bj27Jb9wySn1iFCP/jU1OJLOKPW5ilG88sq9xagABkYf9tH+6gEUBr857bv/AInR7EHx/qb7+7+O/R+Ax/6y9EuPR2yusPlQSjEMWuNPXdVpul9TWAguMbZOUlkm3g8hT6QjrHW84uclBAYrqPfCF9dSKxFncm1WPqmcsh1dAdXrHQQXNhdxQZNdTog17DHVpBE0UcawJbkkPHuDcJrEWUONuJAkckDlpAXOi61YWk7nHJcQmUPqXc1HHHclB1qxnVA3qWrGydjbRLIJHI0s99dH/wDcrFR3d9GnWTtPqIo1NWRtMjZtuXMX+n+K1+Dn/oNaxRZXHO49KPJFK4os8SbRWtpDKfUneFq0juMncKXjSUlYwq1jbSLOJbvLbRo5MEnq1q1thiupvyJQT13X8tYeCfHWUMjXk0jEN/mMfMqwa6vMsiNZwsPtjXVqxUVpeSpv27wamNxWFju0sv8AjJJiV/8AhKieLrsjE2440I1DVcSwpL3vEdGrHW0OSnvIPJjGgMiaOCWo6usShj/1Aq5Y3VvkLO5mVE3txI3D0VyN3NGsiQxuB5jdu+7dyrU/lbt2pasqm3tyfsDTVj/1bXptphNOwMrR3M0W8VAXUhHAqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqC646556guuOueeoLrjrnnqExxGRpCC7SEs/aSS5J6PYg+P9Tff3fx36PwGP/WXoxltdGLLaRmVA5XXWrKG2RomQLGoUdtW063lrNKbZdwk3IdiRppUbxy3G0sNwUbvXra+4tP6BSkn9rRfFoyTmzaASRgaE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)
  • COM 運作情境

    • 每個 COM Object 都是屬於特定類別(class) 的個體(instance)。
    • 我們必須先經由 COM 程式庫得知道物件的類別,才能開始執行該物件的真正個體
    • 每個物件會利用 CLSID 作為鍵值在 WindowsRegistry 登錄資料庫中記錄元件所在的DLL檔案名稱
      • 以便讓 CoCreateInstance 利用 CLSID 作機碼查得檔案的名稱,
      • 必要時可以在 Registry 中新增紀錄或讀取資料。
      • COM 的用戶端程式就是利用 Registry 找出所要使用的元件
      • Client 端在建立物件透過 CoCreateInstance 取得該物件第一個介面指標後,就可以呼叫 QueryInterface,並傳入該介面的 IID,利用IUnknown::QueryInterface,向物件要求取得其他方法所在介面的指標。如果成功的話,就可以使用傳回的指標,便得知物件所提供某個特定介面。 ![1](data:image/jpeg;base64,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)
      • 每個 COM 物件的實作部分都位於伺服器(Server)中。Server 中含有真正用來實作物件方法的程式碼,並且負責維護物件的資料。COM 有三種類型:
        • In-process Server:物件的實作係位於動態連結函式庫中,執行時與 client 端為於同一 process 中。
        • Local Server:物件的實作位於與客戶端相同的機器中,但是在分開的行程內。
        • Remote Server:物件的實作位於與客戶端不同的機器內所執行的 DLL 或獨立行程中。跨機器的分散式系統必須借助Distributed COM (DCOM) 的支援才得以完成。DCOM 是一個高階的網路協定,建立於 COM 之上的規格和服務,讓位於不同電腦上的行程內之 COM 元件可以互相運作 ![3](data:image/jpeg;base64,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)
  • 目前在元件的開發方面發展,有三大陣營

    • DCOM (Distributed Component Object Model)
      • MicrosoftDCOM 就是根據其原本非分散式物件模組 COM 所進化而來的
      • COM+又叫 DCOM 它是 COM 的加強版,主要可遠端執行。
      • DCOM 其實是二次元層次 (Binary Level) 的分散式物件介面標準。
      • 可支援 NTWindows 98
      • 更可伸延到Internet 之策略,Active X 就是其中的表表者。
    • CORBA (Common Object Request Broker Architecture)
    • Java RMI (Remote Method Invocation)
  • IUnknown 介面介紹

      // IUnknown 介面定義
      interface IUnknown
      {
          virtual HRESULT __stdcall QueryInterface(const IID& iid, void **ppv) = 0;
          virtual ULONG  __stdcall AddRef() = 0;
          virtual ULONG __stdcall Release() = 0;
      };
    
    // 自定義介面範例
    { 
        object ,
        uuid( E7CD0D00-1827-11CF-9946-4445535542231 ) 
    }
    
    interface Imyclass : IUnknown
    {
        import    "unknwn.idl" ;
        HRESULT     myFuntion1();
        HRESULT     myFunction2();
    }
    
  • CoCreateInstance 的定義

    STDAPI   CoCreateInstance(
      REFCLSID rclsid ,     /// Class identifier of the object
      LPUNKNOWN pUnkOut ,   /// Pointer to whether object is or isn't part of an aggregate
      DWORD dwClsContext ,   /// Context for running executable code
      REFIID riid ,       /// Reference to the identifier of the interface
      LPVOID *ppv       /// Indirect pointer to the request interface
      )
    
      // 其中,dwClsContext的值是列舉CLSCTX所定義:
      typedef enum tagCLSCTX
      {
          CLSCTX_INPROC_SERVER = 1 ,
          CLSCTX_INPROC_HANDLER = 2 ,
          CLSCTX_LOCAL_SERVER = 4 ,
          CLSCTX_REMOTE_SERVER = 16
      } CLSCTX;
    
  • COM 元件製作

    • 使用由 VB6/C/C++ 開發的 unmanaged 元件,又稱 ActiveX DLL。使用 regsvr32.exe 註冊。
    • 使用 .NET 開發的類別庫專案,又稱 Managed DLL。使用 regasm.exe 註冊。
  • .NET 中的 COM 使用教學

    • 如何在 .NET 專案中引用 COM 元件
      • COM 元件的型別轉成 .NET 型別
        1. 登錄
          • 首先要知道的是,COM 元件和 .NET 元件在使用上有所不同,COM 元件必須先登錄(registered)後才可使用。
          • 透過命令工具 Regsvr32.exe 可以註冊 COM 元件
          • 範例:regsvr32 person.dll
        2. 型別轉換
          • COM 元件中的型別必須轉換成 CLR 認得的型別,這樣子才可以在 .NET 專案中引用 COM 元件。
          • 透過命令工具 TlbImp.exe (型別程式庫匯入工具) ,就可以將 COM 型別程式庫中的型別定義轉換為 CLR 組件中的等效定義。
          • 範例:tlbimp ComLib.dll /out: NetLib.dll
        3. 加入參考
          • 將轉換後的 .NET 組件加入參考後,它會出現在[.NET 頁籤]中的清單。
      • 直接在 .NET 專案中加入 COM 元件參考
        • 要存取 COM 元件,另一個簡單的方法就是直接在 Visual Studio 開發工具裡頭,直接加入該 COM 元件的參考。 因為加入參考時,Visual Studio 就會自動將 COM 元件中的型別定義轉換為 CLR 組件中的等效定義,同時登錄 COM 元件。
        • COM 元件加入參考後,它會出現在[COM 頁籤]中的清單。
    • 如何在 .Net 程式中使用 COM 元件
      • 在匯入 COM 元件的型別程式庫之後,使用程式庫中的物件,就跟直接使用 .NET 建立的物件一樣。 例如 MS Speech Object Library 是一套可用來將文字轉語音的 COM 元件,當我們匯入這個 COM 元件之後,就可以輕輕鬆鬆利用這個元件來叫電腦說話。如下程式碼範例:
          // 加入參考 Microsoft Speech Object 這個 COM 元件
          using SpeechLib;
      
          namespace CSharpComUsingDemo
          {
              class Program
              {
                  static void Main(string[] args)
                  {
                      SpVoice voiceDemo = new SpVoice();
                      voiceDemo.Voice = voiceDemo.GetVoices(string.Empty, string.Empty).Item(0);
                      voiceDemo.Speak("各位好! Nice to Meet you!,我會英文也會中文。", SpeechVoiceSpeakFlags.SVSFDefault);
                  }
              }
          }
      
    • COM Interop 的錯誤處理
      • 雖然 System.Exception 是所有 Exception 物件的最上層類別,但是在 .NET 2.0 之前,它是無法攔截 COM 元件所引發的錯誤的,因為 System.Exception 只能補捉 CLS 相容的錯誤 (CLS - compliant exception, Common Language Specification)。 而 COM 元件所引發的錯誤是 non-CLS-compliant exceptions 的。
      • 但是從 .NET 2.0 開始, System.Runtime.CompilerServices 命名空間增加了 RuntimeWrappedException 類別,這個類別繼承自 System.Exception ,可用來包裝不是衍生自 System.Exception 類別的例外狀況。 RuntimeWrappedException 類別中的 WrappedException 屬性就是用來包裝產生例外的物件。
      • RuntimeCompatibilityAttribute 可用來指定是否使用 RuntimeWrappedException 物件來包裝不是衍生自 Exception 類別的例外狀況。
    • COM Interop 限制
      • Static/shared membersCOM 物件不支援 static/shared 成員。
      • Parameterized constructorsCOM 物件不允許傳參數給 constructor
      • Inheritance:無法辨識基底類別中的遮蔽成員 (shadow members),繼承能力上有所限制。
      • PortabilityCOM 物件必須被註冊後才可使用,非 Windows 的其他系統沒有登入資料庫 (registry),所以無法使用在其他平台。

使用 .Net Core 建立 COM 元件

  • 依據在 GithubNet Sample

    • 目錄路徑 core\extensions\COMServerDemo
    • 裡面的範例中有三個目錄分別是
      • COMClient
        • 使用 COM 引用範例
        • 建立專案
          • dotnet new console COMClient
        • 新增系統管理員執行設定檔
          • COMClient.manifest
          • 內容定義如下
              <?xml version="1.0" encoding="utf-8"?>
              <!-- https://docs.microsoft.com/windows/desktop/sbscs/assembly-manifests -->
              <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
              <assemblyIdentity
                  type="win32" 
                  name="COMClient"
                  version="1.0.0.0" />
            
              <dependency>
                  <dependentAssembly>
                  <!-- RegFree COM matching the registration of the generated managed COM server -->
                  <assemblyIdentity
                      type="win32"
                      name="COMServer.X"
                      version="1.0.0.0"/>
                  </dependentAssembly>
              </dependency>
            
              </assembly>
            
          • COMClient 專案設定檔
              <Project Sdk="Microsoft.NET.Sdk">
            
              <PropertyGroup>
                  <OutputType>Exe</OutputType>
                  <TargetFramework>netcoreapp3.0</TargetFramework>
            
                  <!-- The application manifest is only needed for RegFree COM scenarios -->
                  <ApplicationManifest Condition="'$(RegFree)' == 'True'">COMClient.manifest</ApplicationManifest>
              </PropertyGroup>
            
              <ItemGroup>
                  <!-- Used in lieu of a Primary Interop Assembly (PIA) -->
                  <Compile Include="../COMContract/*.cs" />
              </ItemGroup>
            
              </Project>
            
          • 引用 COM 介面
              namespace COMClient
              {
                  class Program
                  {
                      //......... static void Main(string[] args) { .... }
                  }
            
                  namespace Activation
                  {
                      /// <summary>
                      /// Managed definition of CoClass 
                      /// </summary>
                      [ComImport]
                      [CoClass(typeof(ServerClass))]
                      [Guid(ContractGuids.ServerInterface)] // By TlbImp convention, set this to the GUID of the parent interface
                      internal interface Server : IServer
                      {
                      }
            
                      /// <summary>
                      /// Managed activation for CoClass
                      /// </summary>
                      [ComImport]
                      [Guid(ContractGuids.ServerClass)]
                      internal class ServerClass
                      {
                      }
                  }
              }
            
          • 範例主程式
              using System;
              using System.Runtime.InteropServices;
            
              namespace COMClient
              {
                  class Program
                  {   
                      static void Main(string[] args)
                      {
                          var server = new Activation.Server();
            
                          var pi = server.ComputePi();
                          Console.WriteLine($"\u03C0 = {pi}");
                          Console.Read();
                      }
                  }
              }
            
          • 如果下面的實作也完成時,則編譯執行的順序如下
            1. 編譯同時登錄元件:dotnet.exe build /p:RegFree=True
            2. 如果已經有執行過上面的命令,且又有修改過程式碼
              • 則必須要先清除編譯紀錄:dotnet.exe clean
              • 接著再次執行第一段的編譯指令
            3. 執行程式的方式,直接到編譯後的目錄下
              • COMClient\bin\Debug\netcoreapp3.0\
              • 執行 COMClient.exe 檔案
      • COMContract
        • 定義 COM 元件的 GUID方法介面
          • ContractGuids
              internal sealed class ContractGuids
              {
                  // 定義 COM 元件類別及介面的 GUID 
                  public const string ServerClass = "DB1797F5-7198-4411-8563-D05F4E904956";
                  public const string ServerInterface = "BA9AC84B-C7FC-41CF-8B2F-1764EB773D4B";
              }
            
          • IServer
              using System;
              using System.Runtime.InteropServices;
            
              [ComVisible(true)]
              [Guid(ContractGuids.ServerInterface)]   //定義該類別使用的 GUID 碼
              [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
              public interface IServer
              {
                  /// <summary>
                  /// 定義 COM 元件方法介面
                  /// Compute the value of the constant Pi.
                  /// </summary>
                  double ComputePi();
              }
            
      • COMServer
        • COM 元件內部實作
              using System;
              using System.Runtime.InteropServices;
          
              namespace COMServer
              {
                  [ComVisible(true)]
                  [Guid(ContractGuids.ServerClass)]
                  public class Server : IServer
                  {
                      // 實作 元件 IServer 介面方法
                      double IServer.ComputePi()
                      {
                          double sum = 0.0;
                          int sign = 1;
                          for (int i = 0; i < 1024; ++i)
                          {
                              sum += sign / (2.0 * i + 1.0);
                              sign *= -1;
                          }
          
                          return 4.0 * sum;
                      }
                  }
              }
          
        • [不確定????] dotnet new classlib COMServer
        • COMServer 的專案設定檔
              <Project Sdk="Microsoft.NET.Sdk">
              <PropertyGroup>
                  <!--
                      COM servers must define a framework to use in situations where a CLR instance is not already present in the process.
                      Note that since the COM server may be activated in a process where the CLR must be activated, both the projects
                      *.runtimeconfig.json and *.deps.json files must be bundled with the server itself.
          
                      In the following example, the following files are needed to deploy the COM server:
                          COMServer.comhost.dll
                          COMServer.dll
                          COMServer.deps.json
                          COMServer.runtimeconfig.json
          
                      In a RegFree COM scenario, the following file must also be deployed:
                          COMServer.X.manifest
                  -->
                  <TargetFramework>netcoreapp3.0</TargetFramework>
          
                  <!-- Indicate the assembly is providing a COM server -->
                  <EnableComHosting>True</EnableComHosting>
          
                  <!-- Generate a RegFree COM manifest -->
                  <EnableRegFreeCom Condition="'$(RegFree)' == 'True'">True</EnableRegFreeCom>
              </PropertyGroup>
          
              <ItemGroup>
                  <!-- Used in lieu of a Primary Interop Assembly (PIA) -->
                  <Compile Include="../COMContract/*.cs" />
              </ItemGroup>
          
              <Target Name="ServerUsage"
                      Condition="'$(RegFree)' != 'True'"
                      AfterTargets="Build">
                  <Message Importance="High" Text="%0a************************************%0a*** $(MSBuildProjectName) usage instructions ***%0a************************************" />
                  <Message Importance="High" Text="The server must be COM registered in order to activate.%0aThe following commands must be executed from an elevated command prompt." />
                  <Message Importance="High" Text="Register:%0a    regsvr32.exe &quot;$(ProjectDir)$(OutputPath)$(ComHostFileName)&quot;" />
                  <Message Importance="High" Text="Unregister:%0a    regsvr32.exe /u &quot;$(ProjectDir)$(OutputPath)$(ComHostFileName)&quot;" />
              </Target>
          
              <Target Name="ServerUsage_RegFree"
                      Condition="'$(RegFree)' == 'True'"
                      AfterTargets="Build">
                  <Message Importance="High" Text="%0a************************************%0a*** $(MSBuildProjectName) usage instructions ***%0a************************************" />
                  <Message Importance="High" Text="A RegFree COM manifest has been created for the server.%0aThe manifest '@(RegFreeComManifest->'%(Filename)%(Extension)')' must be included during server deployment.%0aThe COMServer project will copy all required outputs to the COMClient output directory." />
          
                  <ItemGroup>
                  <ServerOutput Include="$(OutputPath)*.dll" />
                  <ServerOutput Include="$(OutputPath)*.runtimeconfig.json" />
                  <ServerOutput Include="$(OutputPath)*.deps.json" />
                  <ServerOutput Include="$(OutputPath)*.manifest" />
                  </ItemGroup>
          
                  <!-- Deploy all required server outputs -->
                  <Copy SourceFiles="@(ServerOutput)"
                      DestinationFolder="../COMClient/$(OutputPath)" />
              </Target>
          
              <Target Name="Clean_RegFree"
                      AfterTargets="Clean">
                  <ItemGroup>
                  <ServerOutputToDelete Include="../COMClient/$(OutputPath)COMServer.*" />
                  </ItemGroup>
          
                  <!-- Cleanup deployed server outputs -->
                  <Delete Files="@(ServerOutputToDelete)" />
              </Target>
          
              </Project>
          
  • 參考來源