Registration-Free aktywacja programu . składnikiNET-Based: przewodnik
Steve White
Pomoc techniczna Premier dla deweloperów w Wielkiej Brytanii
Leslie Muller
Global IT Research & Development, Credit Suisse First Boston
Lipiec 2005 r.
Podsumowanie: Zestaw SDK platformy Microsoft doskonale nadaje się do dokumentowania tematów izolowanych aplikacji i zestawów równoległych. Jednak nie wszyscy są w tym temacie przypisani do aktywacji składników COM bez rejestracji. Model COM bez rejestracji to funkcja platformy, która jest bardzo interesująca dla przedsiębiorstw z zablokowanymi serwerami i aplikacjami odizolowanymi od udostępnionych infrastruktury. W tym artykule przedstawiono działający przykład aktywacji bez rejestracji składnika opartego na programie .NET Framework przez klientów natywnych za pośrednictwem międzyoperacyjności modelu COM. (11 stron drukowanych)
Dotyczy:
Microsoft Windows Server 2003
Microsoft Windows XP z dodatkiem Service Pack 2
Microsoft .NET Framework w wersji 1.1
Microsoft Visual Studio .NET 2003
Microsoft Visual Basic 6.0
Pobierz przykład, który towarzyszy temu artykułowi, MSDNRegFreeNet.msi.
zawartość
Wprowadzenie
Terminologia Registration-Free COM
Uruchamianie przykładu
Kompilowanie zestawu .NET jako serwera COM
Kompilowanie klienta
aktywacja Registration-Free
Rozwiązywanie problemów
Konkluzja
Linki zewnętrzne
Wprowadzenie
Bez rejestracji COM to mechanizm dostępny na platformach Microsoft Windows XP (SP2 dla składników opartych na programie .NET Framework) i Microsoft Windows Server 2003. Jak sugeruje nazwa, mechanizm umożliwia łatwe (np. XCOPY) wdrażanie składników COM na maszynie bez konieczności ich rejestrowania.
Na platformach docelowych jednym z etapów inicjowania procesu i jego modułów zależnych jest załadowanie wszystkich skojarzonych plików manifestu do struktury pamięci nazywanej kontekstem aktywacji . W przypadku braku odpowiednich wpisów rejestru jest to kontekst aktywacji, który dostarcza informacje o powiązaniu i aktywacji wymagane przez środowisko uruchomieniowe COM. Żaden specjalny kod nie jest wymagany na serwerze COM lub w kliencie, chyba że zdecydujesz się zrezygnować z używania plików przez samodzielne tworzenie kontekstów aktywacji przy użyciu interfejsu API kontekstu aktywacji .
W tym przewodniku skompiluję prosty zestaw .NET i zużyję go zarówno zarejestrowany, jak i wyrejestrowany, z natywnych klientów COM napisanych w języku Visual C++ i Visual Basic 6.0. Możesz pobrać kod źródłowy i przykłady i zobaczyć je w akcji od razu lub skorzystać z przewodnika i utworzyć je samodzielnie krok po kroku.
Terminologia Registration-Free COM
Każda osoba zaznajomiona z technologią .NET będzie przyzwyczajona do terminu zestaw co oznacza zestaw wdrożonych lub kilku modułów o nazwie i wersji jako jednostki z jednym modułem zawierającym manifest definiujący zestaw. W modelu COM bez rejestracji terminy zestaw i manifest są pożyczane na pomysły podobne w koncepcji, ale nie identyczne z ich odpowiednikami platformy .NET.
Bez rejestracji com używa zestawu oznaczać zestaw co najmniej jednego modułu PE (tj. natywnego lub zarządzanego) wdrożonych, nazwanych i w wersji jako jednostki. Bez rejestracji com używa manifestu do odwoływania się do plików tekstowych z rozszerzeniem manifestu zawierającego kod XML, który definiuje tożsamość zestawu (manifest zestawu) wraz ze szczegółami powiązania i aktywacji jej klas lub definiuje tożsamość aplikacji (manifest aplikacji) wraz z co najmniej jednym odwołaniem do tożsamości zestawu. Plik manifestu zestawu ma nazwę dla zestawu, a plik manifestu aplikacji ma nazwę dla aplikacji.
Termin zestawy równoległe (SxS) odnosi się do konfiguracji różnych wersji tego samego składnika COM, za pośrednictwem plików manifestu, aby mogły być ładowane jednocześnie przez różne wątki bez konieczności rejestrowania. SxS umożliwia i jest luźno synonimem bez rejestracji com.
Uruchamianie przykładu
Po pobraniu i wyodrębnieniu przykładowego kodu znajdziesz folder o nazwie \deployed. W tym miejscu znajduje się wersja programu Visual C++ aplikacji klienckiej (client.exe), jej manifest (client.exe.manifest) oraz wersja języka C# serwera COM (SideBySide.dll). Przejdź dalej i uruchom client.exe. Oczekiwanym wynikiem jest to, że
Kompilowanie zestawu .NET jako serwera COM
Krok 1
W programie
Kod w języku C#
using System;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: Guid("[LIBID_SideBySide]")]
namespace SideBySide
{
[Guid("[IID_ISideBySideClass]")]
public interface ISideBySideClass
{
string Version();
}
[Guid("[CLSID_SideBySideClass]")]
public class SideBySideClass : ISideBySideClass
{
public string Version()
{
return "1.0.0-C#";
}
}
}
Kod platformy .NET w języku Visual Basic
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
<Assembly: AssemblyVersion("1.0.0.0")>
<Assembly: Guid("[LIBID_SideBySide]")>
<Guid("[IID_ISideBySideClass]")> _
Public Interface ISideBySideClass
Function Version() As String
End Interface
<Guid("[CLSID_SideBySideClass]")> _
Public Class SideBySideClass
Implements ISideBySideClass
Function Version() As String Implements ISideBySideClass.Version
Version = "1.0.0-VB.NET"
End Function
End Class
Zapisałem wartości identyfikatora GUID, które będą szczególne dla projektu, w postaci symboli zastępczych. Musisz użyć narzędzia guidgen, aby wygenerować unikatowe identyfikatory GUID, które będą odpowiednimi wartościami, które zamierzam później użyć symboli zastępczych.
Krok 2
Aby biblioteka typów została wygenerowana i zarejestrowana w czasie kompilacji, ustaw ustawienie register for COM Interop wartość true dla projektu.
Krok 3
Utwórz kompilację wydania i skopiuj SideBySide.dll do \deployed.
Kompilowanie klienta
Następnym krokiem jest skompilowanie klienta. W tym przewodniku masz możliwość skompilowania Visual C++ lub klienta Visual Basic 6.0.
Krok 4 (opcja A: Visual C++)
Utwórz nowy projekt konsoli win32 Visual C++ o nazwieclient w folderze równorzędnym względem folderu SideBySide projektu. W kreatorze aplikacji Win32na karcie Ustawienia aplikacji zaznacz pole wyboru Dodaj obsługę ATL.
Edytuj stdafx.h i dodaj następujący wiersz w górnej części pliku bezpośrednio po #pragma once
:
#define _WIN32_DCOM
Ponadto w pliku stdafx.h dodaj następujący wiersz w dolnej części pliku:
import "[path]\SideBySide.tlb" no_namespace
W tym miejscu [ścieżka] powinna być ścieżką względną do biblioteki typów wygenerowanej podczas tworzenia zestawu SideBySide. Ta ścieżka zwykle różni się w zależności od tego, czy w kroku 1 wybrano projekt języka C#, czy projekt .NET języka Visual Basic.
Zastąp zawartość client.cpp następującym kodem:
#include "stdafx.h"
#include <iostream>
using namespace std;
void ErrorDescription(HRESULT hr)
{
TCHAR* szErrMsg;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&szErrMsg, 0, NULL) != 0)
{
cout << szErrMsg << endl;
LocalFree(szErrMsg);
}
else
cout << "Could not find a description for error 0x"
<< hex << hr << dec << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(0, COINIT_MULTITHREADED);
{
ISideBySideClassPtr ptr;
HRESULT hr =
ptr.CreateInstance(__uuidof(SideBySideClass));
if (SUCCEEDED(hr))
{
cout << ptr->Version() << endl;
}
ErrorDescription(hr);
char c;
cin >> c;
}
CoUninitialize();
return 0;
}
Utwórz kompilację wydania i skopiuj \release\client.exe do \deployed.
Krok 4 (Opcja B: Visual Basic 6.0)
Utwórz nowy projekt exe
Kliknij dwukrotnie formularz główny w projektancie formularzy i wklej następujący kod w Sub Form_Load():
Dim obj As New SideBySideClass
Dim isxs As SideBySide.ISideBySideClass
Set isxs = obj
MsgBox isxs.Version()
Wybieranie pliku | Utwórz client.exe... i przejdź do folderu \deployed, a następnie wybierz pozycję OK.
Krok 5
Obecnie folder \deployed powinien zawierać oprócz niektórych plików pośrednich tylko client.exe i SideBySide.dll; i ten ostatni zostanie zarejestrowany przez proces kompilacji. Aby sprawdzić, czy serwer i klient współpracują ze sobą w normalnych okolicznościach, uruchom \deployed\client.exe i zanotuj oczekiwane dane wyjściowe "1.0.0-C#" lub "1.0.0-VB.NET".
Krok 6
Ten przewodnik dotyczy bez rejestracji COM, dlatego teraz musimy wyrejestrować zestaw SideBySide. W wierszu polecenia programu Visual Studio 2003 przejdź do folderu \deployed i wykonaj polecenie: regasm /u SideBySide.dll
.
Krok 7
Aby zobaczyć, jaki efekt miał poprzedni krok, uruchom ponownie \deployed\client.exe i zostanie wyświetlony komunikat "Klasa niezarejestrowana" lub "Błąd czasu wykonywania "429": składnik ActiveX nie może utworzyć obiektu". Na tym etapie sfrustrowaliśmy środowisko uruchomieniowe COM od znalezienia potrzebnych informacji w rejestrze, ale nie udostępniliśmy informacji w alternatywny sposób. Usuniemy to w poniższych krokach.
aktywacja Registration-Free
Krok 8
W folderze \deployed utwórz plik manifestu aplikacji (plik tekstowy) dla aplikacji client.exe i wywołaj go client.exe.manifest. Wklej następujące elementy do pliku:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type = "win32"
name = "client"
version = "1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="SideBySide"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
Krok 9
W folderze projektu SideBySide utwórz plik manifestu zestawu prywatnego (plik tekstowy) i wywołaj go SideBySide.manifest. Wklej następujące elementy do pliku:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type="win32"
name=" SideBySide"
version="1.0.0.0" />
<clrClass
clsid="{[CLSID_SideBySideClass]}"
progid="SideBySide.SideBySide"
threadingModel="Both"
name="SideBySide.SideBySideClass" >
</clrClass>
</assembly>
Następnym zadaniem jest osadzić powyższy plik manifestu zestawu w zestawie SideBySide jako zasób Win32. W momencie pisania tego artykułu jest to obowiązkowe w przypadku systemu Windows XP, ale nie dla systemu Windows Server 2003. W systemie Windows Server 2003 można uciec od prostego wdrażania pliku manifestu zestawu obok zestawu. Jednak zachęcam, aby nie zależeć od tego zachowania, ponieważ może również ulec zmianie w nadchodzącym dodatku Service Pack systemu Windows Server 2003. Aby zapewnić ciągłą obsługę obu platform w przyszłości, wykonaj kilka następnych kroków i osadź plik manifestu zestawu w zestawie platformy .NET jako zasób Win32. Jest to konieczne tylko w przypadku bezpłatnej rejestracji aktywacji . Składniki oparte na platformie NET i nie są wymagane do aktywacji bez rejestracji natywnych składników com.
Krok 10
W folderze projektu
#include <windows.h>
#define MANIFEST_RESOURCE_ID 1
MANIFEST_RESOURCE_ID RT_MANIFEST SideBySide.manifest
Plik windows.h i jego zależności są dostępne podczas instalowania zestawu SDK platformy (podstawowego zestawu SDK) lub Visual C++. Część windows.h, która jest wymagana w tym miejscu, to definicja:
#define RT_MANIFEST 24
W związku z tym zawartość SideBySide.rc rozpoznawana jako:
1 24 SideBySide.manifest
Jednak jest bardziej jasne i bardziej ogólne, aby używać definicji makr zgodnie z zaleceniami.
Krok 11
W folderze projektu SideBySide utwórz plik polecenia kompilacji (plik tekstowy) i wywołaj go build.cmd. Wklej następujące elementy do pliku:
Aby skompilować język C#:
rc SideBySide.rc
csc /t:library /out:..\deployed\SideBySide.dll
/win32res:SideBySide.res Class1.cs
Aby skompilować platformę .NET języka Visual Basic:
rc SideBySide.rc
vbc /t:library /out:..\deployed\SideBySide.dll
/win32resource:SideBySide.res /rootnamespace:SideBySide Class1.vb
Te polecenia należy najpierw wywołać narzędzie kompilatora zasobów systemu Microsoft Windows z zestawu SDK platformy (rc.exe) w celu skompilowania skryptu definicji zasobów z kroku 10 do skompilowanego pliku zasobów o nazwie SideBySide.res. Następnie wywołuje kompilator języka C# lub Visual Basic .NET, aby skompilować plik kodu źródłowego w zestawie i osadzić w nim skompilowany plik zasobów jako zasób Win32. Skompilowany zestaw jest zapisywany w folderze \deployed, ale nie jest zarejestrowany dla międzyoperacjności modelu COM.
Krok 12
W wierszu polecenia programu Visual Studio 2003 przejdź do folderu SideBySide projektu i wykonaj polecenie: build
.
Krok 13
Aby to sprawdzić, dzięki uprzejmości plików manifestu klient jest jeszcze raz w stanie aktywować klasę SideBySideClass za pośrednictwem międzyoperacyjności COM, uruchomić \deployed\client.exe i zanotować oczekiwane dane wyjściowe "1.0.0-C#" lub "1.0.0-VB.NET".
Rozwiązywanie problemów
Jak widzieliśmy, aktywacja bez rejestracji składników opartych na programie .NET Framework nie wymaga specjalnego kodu na serwerze ani na kliencie. Wszystko, co jest wymagane, to zgodna para plików manifestu, z których jedna jest osadzona w zestawie platformy .NET jako zasób typu Win32 RT_MANIFEST.
Proponuję, aby zbliżyć się do własnego programowania bez rejestracji, tak jak robi to przewodnik. W szczególności: najpierw przejdź do znanego stanu, widząc klienta pracującego z zarejestrowanym serwerem; następnie wyrejestruj serwer i upewnij się, że komunikat o błędzie jest oczekiwany; i wreszcie zaradzić sytuacji poprzez tworzenie i wdrażanie plików manifestu. W ten sposób wysiłki związane z rozwiązywaniem problemów związane z aktywacją bez rejestracji zostaną ograniczone do struktury plików manifestu i poprawnego osadzania manifestu zestawu.
Podczas rozwiązywania problemów z bezpłatną rejestracją modelu COM Podgląd zdarzeń w systemie Windows Server 2003 jest Twoim przyjacielem. Gdy system Windows XP lub Windows Server 2003 wykryje błąd konfiguracji, zazwyczaj będzie wyświetlany komunikat o błędzie zatytułowany dla uruchomionej aplikacji i zawierający komunikat "Ta aplikacja nie powiodła się, ponieważ konfiguracja aplikacji jest niepoprawna. Ponowne zainstalowanie aplikacji może rozwiązać ten problem". Zalecam, aby za każdym razem, gdy widzisz ten komunikat odtworzyć problem w systemie Windows Server 2003, zapoznaj się z dziennikiem zdarzeń systemu i poszukaj zdarzeń ze źródła SideBySide. Powodem, dla którego nie proponuję przyjrzeć się dziennikowi zdarzeń XP w tych przypadkach, jest to, że będzie on niezmiennie zawierać komunikat, taki jak "Generowanie kontekstu aktywacji nie powiodło się dla [path]\[nazwa pliku aplikacji]. Manifest. Komunikat o błędzie odwołania: Operacja została ukończona pomyślnie", która nie pomaga zidentyfikować problemu.
Przed przejściem do struktury plików manifestu porozmawiajmy o zasobach Win32. Jak wspomniano powyżej, windows.h definiuje symbol RT_MANIFEST jako wartość 24, która jest wartością, którą system operacyjny rozpozna jako osadzony plik manifestu. Jeśli zapomnisz dołączyć windows.h skryptu definicji zasobów (plik rc), kompilacja nadal zakończy się powodzeniem, a plik manifestu będzie nadal osadzony jako zasób, ale nie jest prawidłowym typem. Aby sprawdzić, czy manifest został poprawnie osadzony, otwórz SideBySide.dll w programie Visual Studio ( plik| Otwórz | Plik...). Zobaczysz widok drzewa przedstawiający zasoby w module. W węźle głównym powinien być węzeł o nazwie RT_MANIFEST poniżej, który powinien być innym węzłem przedstawiającym numer zasobu manifestu (1 w przewodniku). Kliknij dwukrotnie ten ostatni węzeł, aby wyświetlić dane w widoku binarnym i zapewnić szybkie sprawdzenie, czy jest on podobny do pliku manifestu XML. Chociaż jest to plik binarny, znaki z zakresu ASCII będą oczywiste. Jeśli brakuje danych binarnych lub wygląda niepoprawnie, sprawdź, czy skrypt definicji zasobów (plik rc) odwołuje się do pliku manifestu. Jeśli tekst węzła RT_MANIFEST znajduje się w cudzysłowie, prawdopodobnie zapomniano dołączyć windows.h w skrypcie definicji zasobów (plik rc).
Każdy z wymienionych błędów zostanie zgłoszony w dzienniku zdarzeń systemu Windows Server 2003 z komunikatem: "Nie można odnaleźć zestawu zależnego [name] i ostatni błąd nie został zainstalowany w systemie.
Schematy różnych plików manifestu są udokumentowane w zestawie SDK platformy pod nagłówkiem Manifest Files Reference, a narzędzie sprawdzania poprawności schematu Manifestchk.vbs jest dostępne, więc tutaj objaśnię tylko kilka punktów istotnych dla przewodnika. Najpierw przeanalizujmy plik manifestu zestawu. Na przykład wróć do kroku 9.
Jak pamiętasz, w bez rejestracji com sens, zestaw jest abstrakcyjnym pomysłem, z którym kojarzysz jeden lub więcej plików fizycznych za pomocą zawartości pliku manifestu zestawu .
Element assemblyIdentity definiuje tożsamość zestawu . Dla. Składniki oparte na platformie NET jego nazwa
Element
Teraz zwróćmy uwagę na plik manifestu aplikacji. Na przykład wróć do kroku 8. manifestu aplikacji musi mieć nazwę w formacie [nazwa pliku aplikacji].manifest. Dlatego w przewodniku nazwano go client.exe.manifest, aby wyjaśnić, że powinien być odczytywany za każdym razem, gdy client.exe jest ładowany do procesu. Jeśli nie zostało to wykonane poprawnie, funkcja CoCreateInstance zwróci wartość HRESULT z wartością REGDB_E_CLASSNOTREG (0x80040154), tekst komunikatu, dla którego jest "Klasa nie jest zarejestrowana".
Najważniejszym elementem manifestu aplikacji jest element dependentAssembly/assemblyIdentity. Ten element jest odwołaniem do równoważnego w manifeście zestawu, a dwa muszą być zgodne dokładnie. Dobrym sposobem zapewnienia, że to zrobić, jest skopiowanie elementu z manifestu zestawu i wklejenie go tutaj. Jeśli istnieje jakakolwiek różnica, w dzienniku zdarzeń systemu Windows Server 2003 zostanie wyświetlony następujący komunikat: "Tożsamość składnika znaleziona w manifeście nie jest zgodna z tożsamością żądanego składnika".
Konkluzja
Bez rejestracji COM to technologia, która wyzwala składniki COM z zależności od rejestru systemu Windows i w konsekwencji wyzwala aplikacje, które korzystają z nich z wymagających dedykowanych serwerów. Umożliwia to aplikacjom z zależnościami w różnych wersjach tego samego składnika COM współużytkowanie infrastruktury i ładowanie tych różnych wersji składników COM obok siebie w echo mechanizmu przechowywania wersji i wdrażania platformy .NET.
W tym artykule przedstawiono pokaz bezpłatnej rejestracji składników opartych na programie .NET Framework przez natywne aplikacje klienckie napisane zarówno w języku Visual C++, jak i Visual Basic 6.0. Wyjaśniono, jak działa mechanizm i podkreślił niektóre możliwe błędy konfiguracji i jak je rozwiązywać.
Linki zewnętrzne
- Registration-Free aktywacja składników COM: przewodnik
- izolowanych aplikacji i zestawów równoległych
- schematu pliku manifestu
- korzystanie z interfejsu API kontekstu aktywacji
Informacje o autorze
Steve White jest konsultantem ds. tworzenia aplikacji pracującym w zespole pomocy technicznej Premier dla deweloperów w firmie Microsoft UK. Obsługuje on tworzenie aplikacji za pomocą języka Visual C#, windows Forms i ASP.NET. Jego blog zawiera więcej informacji na temat jego zainteresowań w muzyce, wizualizacjach i programowaniu.
Leslie Muller jest technologiem z zespołem research & Development w Credit Suisse First Boston. Leslie ma 12-letnie doświadczenie jako deweloper i architekt techniczny, pracujący w środowiskach takich jak usługi finansowe, startupy technologiczne, automatyzacja przemysłowa i obrona. Kiedy nie programuje ani nie wykonuje badań, lubi jeździć na nartach, hokej na lodzie i kiedy to możliwe robi nieco szalone rzeczy z pojazdami motoryzowanymi w ekstremalnych środowiskach, takich jak Islandia lub Rockies.