70-536: Using COM Components from the .NET Framework

Poniższy artykuł pochodzi z serii Przygotowań do egzaminu 70-536.

Framework .NET zapewnia zarządzalne odpowiedniki dla niemal każdej funkcji Win32, którą chcielibyśmy wywołać. Jednak duża ilość istniejącego kodu niezarządzalnego (ang. unmanaged) zmusza osoby tworzące oprogramowanie, aby znały metody korzystania z obiektów COM (Component Object Model).

Jako przykładem posłużymy się Microsoft Speech Object Library (%Windir%\System32\Speech\Common\Sapi.dll) – biblioteką dającą dostęp do systemowego mechanizmu syntezy mowy.

Niech nasza aplikacja przemówi!

Aplikacja może do nasz przemówić, ale niestety jedynie po angielsku. Aby skorzystać z mechanizmu, który nie ma swojego zarządzalnego odpowiednika wykonujemy kolejne kroki:

  1. W Visual Studio tworzymy nowy projekt (WPF, lub Windows Forms),
  2. Dodajemy referencję do obiektu COM - Sapi.dll (Add Reference, zakładka COM), powinniśmy zobaczyć załadowaną bibliotekę: image
  3. Dodajemy przestrzeń nazw SpeechLib:
  4.    1: using SpeechLib;
  5. Dodajemy pola TextBox i Button, klikamy dwukrotnie przycisk,
  6. Dodajemy kod:
  7.    1: SpVoice voice = new SpVoice();
       2: voice.Speak(textBox1.Text, SpeechVoiceSpeakFlags.SVSFDefault);

Inną możliwością skorzystania z biblioteki jest przekonwertowanie jej do obiektu assembly. W tym celu uruchamiamy Visual Studio Command Prompt z uprawnieniami administratora, następnie wywołujemy:

tlbimp %windir%\system32\speech\common\sapi.dll

W wyniku wywołania tego polecenia otrzymamy sporą liczbę ostrzeżeń, oraz plik SpeechLib.dll. Możemy go dodać jako referencję.

image

DllImport

Atrybut DllImport, dostępny w przestrzeni nazw System.Runtime.InteropServices, potrafi załadować niezarządzalny kod DLL. Przykład dostępu do metody MessageBox z pliku User32.dll:

using System;
using System.Runtime.InteropServices;
namespace com_example
{
    class Program
    {
        [DllImport("user32.dll")]
        private static extern int MessageBox(IntPtr hWnd, String
        text, String caption, uint type);
        static void Main(string[] args)
        {
            MessageBox(
            new IntPtr(0), "Hello, world!", "My box", 0);
        }
    }
}

Atrybut DllImport może przyjąć dodatkowe właściwości konfiguracyjne. Przykładowo EntryPoint pozwala przypisać metodę do prototypu o innej nazwie:

   1: using System;
   2: using System.Runtime.InteropServices;
   3: namespace com_example
   4: {
   5:     class Program
   6:     {
   7:         [DllImport("user32.dll", EntryPoint = "MessageBox")]
   8:         private static extern int ShowBox(IntPtr hWnd, String text,
   9:         String caption, uint type);
  10:         static void Main(string[] args)
  11:         {
  12:             ShowBox(new IntPtr(0), "Hello, world!", "My box", 0);
  13:         }
  14:     }
  15: }

Typy COM i klasy .NET mogą różnić się od siebie. Dlatego .NET Framework wykorzystuje serializację (marshalling), by dopasować parametry do COM.

Klasa opakowująca

Jeśli chcemy wywoływać kod niezarządzalny przez klasy zarządzalne możemy go opakować. Klasa opakowująca (ang. wrapper clacc) udostępnia metody, które wywołują kod niezarządzalny. Dla każdej funkcji, którą będziemy chcieli wywoływać tworzymy statyczną metodę. Przykład:

   1: using System;
   2: using System.Runtime.InteropServices;
   3: class Win32MessageBox
   4: {
   5:     [DllImport("user32.dll")]
   6:     private static extern int MessageBox(IntPtr hWnd, String text,
   7:     String caption, uint type);
   8:     public static void Show(string message, string caption)
   9:     {
  10:         MessageBox(new IntPtr(0), message, caption, 0);
  11:     }
  12: }

Kolejny artykuł z serii to 70-536:Using .NET Types from COM Applications

Tagi:

Comments (1) -

reichel
reichel Poland
1/12/2010 3:40:45 PM Permalink

Trochę  mylące może być stawianie funkcji MessageBox (i " Przykład dostępu do metody MessageBox z pliku User32.dll:" nazywanie jej metodą) wraz z obiektami COM. Nie jest to jasno rozgraniczone (ktoś może pomyśleć, że to też COM).

Pingbacks and trackbacks (2)+

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading


Eastgroup.pl na facebooku