Sdílet prostřednictvím


Registration-Free aktivace . komponentyNET-Based: Návod

 

Steve White
Premier Support for Developers, Microsoft UK

Leslie Muller
Global IT Research & Development, Credit Suisse First Boston

Červenec 2005

Shrnutí: Sada Microsoft Platform SDK poskytuje vynikající úlohu dokumentování témat izolovaných aplikací a souběžných sestavení. Ne všichni se však s tímto tématem vyrovnává s aktivací komponent modelu COM bez registrace. Com bez registrace je funkce platformy, která je velmi zajímavá pro podniky s uzamčenými servery a aplikacemi izolovanými na sdílených infrastrukturách. Tento článek vás provede funkčním příkladem registrace bezplatné aktivace komponenty založené na rozhraní .NET Framework nativními klienty prostřednictvím zprostředkovatele komunikace com. (11 vytištěných stránek)

Platí pro:
   Microsoft Windows Server 2003
   Microsoft Windows XP Service Pack 2
   Microsoft .NET Framework verze 1.1
   Microsoft Visual Studio .NET 2003
   Microsoft Visual Basic 6.0

Stáhněte si ukázku, která doprovází tento článek, MSDNRegFreeNet.msi.

obsahu

Úvod
terminologie modelu COM Registration-Free
Spuštění ukázky
Vytvoření sestavení .NET jako serveru COM
Sestavení klienta
Aktivace Registration-Free
Řešení problémů
Závěr
Další čtení

Úvod

Com bez registrace je mechanismus, který je k dispozici na platformě Microsoft Windows XP (SP2 pro komponenty založené na rozhraní .NET Framework) a microsoft Windows Server 2003. Jak název napovídá, mechanismus umožňuje snadné (např. XCOPY) nasazení komponent MODELU COM na počítač bez nutnosti jejich registrace.

Na cílových platformách je jednou z fází inicializace procesu a jeho závislých modulů načtení všech přidružených souborů manifestu do struktury paměti označované jako kontext aktivace . V případě absence odpovídajících položek registru se jedná o kontext aktivace, který poskytuje vazbu a informace o aktivaci, které modul runtime modelu COM potřebuje. Na serveru COM nebo v klientovi není vyžadován žádný speciální kód, pokud se nerozhodnete zneužít soubory vytvořením kontextů aktivace sami pomocí kontextového rozhraní API pro aktivaci.

V tomto názorném postupu vytvořím jednoduché sestavení .NET a použijem ho z nativních klientů MODELU COM napsaných v jazyce Visual C++ a Visual Basic 6.0. Zdrojový kód a ukázky si můžete stáhnout a hned je zobrazit v akci, nebo si je můžete projít s návodem a vytvořit si je krok za krokem.

terminologie modelu COM Registration-Free

Každý, kdo je obeznámen s technologií .NET, bude zvyklý na termín sestavení význam sady jednoho nebo více modulů nasazených, pojmenovaných a vydaných verzí jako jednotky s jedním modulem obsahujícím manifest, který sadu definuje. V modelu COM bez registrace jsou termíny sestavení a manifestu půjčovány pro nápady, které jsou podobné v konceptu, ale nejsou identické s jejich protějšky .NET.

Model COM bez registrace používá sestavení znamená sadu jednoho nebo více modulů PE (tj. nativních nebo spravovaných) nasazených, pojmenovaných a verzí jako jednotky. Com bez registrace používá manifest odkazovat na textové soubory s příponou .manifest obsahující XML, která buď definuje identitu sestavení (manifest sestavení) společně s vazbou a aktivačními podrobnostmi jeho tříd, nebo definuje identitu aplikace (manifest aplikace) spolu s jedním nebo více odkazy na identitu sestavení. Soubor manifestu sestavení je pojmenován pro sestavení a soubor manifestu aplikace je pojmenován pro aplikaci.

Termín souběžná sestavení (SxS) odkazuje na konfiguraci různých verzí stejné komponenty COM prostřednictvím souborů manifestu, aby je bylo možné načíst současně různými vlákny bez nutnosti registrace. SxS umožňuje a je volně synonymem, registrace com.

Spuštění ukázky

Po stažení a extrahování ukázkového kódu najdete složku s názvem \deployed. Zde je verze visual C++ klientské aplikace (client.exe), jeho manifest (client.exe.manifest) a verze C# serveru COM (SideBySide.dll). Pokračujte a spusťte client.exe. Očekávaným výsledkem je, že client.exe aktivuje instanci SideBySideClass (implementované v SideBySide.dll) a zobrazí výsledek volání verze metody, která by měla vypadat jako 1.0.0-C#.

Vytvoření sestavení .NET jako serveru COM

Krok 1

V Visual Studio .NET 2003 vytvořit nový jazyka C# nebo projektu knihovny tříd jazyka Visual Basic .NET a volat ho SideBySide. Odeberte AssemblyInfo. [cs/vb] soubor z projektu a implementujte třídu následujícím způsobem:

Kód jazyka 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#";
      }
   }
}

Kód .NET jazyka 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

Napsal(a) jsem hodnoty GUID, které budou specifické pro váš projekt, ve formě zástupných symbolů. Budete muset použít nástroj guidgen k vygenerování jedinečných identifikátorů GUID, které budou odpovídajícími hodnotami, které budu mít v úmyslu, když následně použijem zástupné symboly.

Krok 2

Aby se knihovna typů vygenerovala a zaregistrovala v době sestavení, nastavte nastavení Registrace projektu pro zprostředkovatele komunikace modelu COM na hodnotu true.

Krok 3

Vytvoří sestavení vydané verze a zkopíruje SideBySide.dll do \nasazeného.

Sestavení klienta

Dalším krokem je sestavení klienta a pro tento názorný postup máte možnost sestavit klienta Visual C++ nebo klienta Visual Basic 6.0.

Krok 4 (možnost A: Visual C++)

Vytvořte nový projekt konzoly Visual C++ Win32 označovaný jako klientská ve složce na stejné úrovni vzhledem ke složce projektu SideBySide. V Průvodce aplikací Win32na kartě Nastavení aplikace zaškrtněte políčko Přidat podporu pro atL.

Upravte stdafx.h a do horní části souboru přidejte následující řádek hned za #pragma once:

#define _WIN32_DCOM

Do stdafx.h přidejte do dolní části souboru následující řádek:

import "[path]\SideBySide.tlb" no_namespace

Tady [cesta] by měla být relativní cesta ke knihovně typů, která byla vygenerována při vytváření sestavení SideBySide. Tato cesta se obvykle liší v závislosti na tom, jestli jste v kroku 1 zvolili projekt C# nebo visual basic .NET.

Nahraďte obsah client.cpp tímto kódem:

#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;
}

Vytvoří sestavení vydané verze a zkopíruje \release\client.exe do \nasazeného.

Krok 4 (možnost B: Visual Basic 6.0)

Vytvořte nový projektu visual basicu 6.0 Standard EXE. V Průzkumníku projektů vyberte uzel Project1 a v okně vlastností změňte jeho název na klienta. Zvolte soubor | Uložte project jako a uložte soubor formuláře a soubor projektu ve složce na stejné stejné hodnotě vzhledem ke složce projektu SideBySide projektu. Zvolte Project | Odkazy, zaškrtněte políčko vedle SideBySide a zvolte OK.

Dvakrát klikněte na hlavní formulář v návrháři formulářů a vložte následující kód do Sub Form_Load():

    Dim obj As New SideBySideClass
    Dim isxs As SideBySide.ISideBySideClass
    Set isxs = obj
    MsgBox isxs.Version()

Zvolte soubor | Nastavte client.exe... a přejděte do složky \deployed a pak zvolte OK.

Krok 5

V současné době by složka \nasazená měla obsahovat kromě některých zprostředkujících souborů pouze client.exe a SideBySide.dll; a ta druhá bude zaregistrována procesem sestavení. Pokud chcete zkontrolovat, jestli váš server a klient za těchto normálních okolností spolupracují, spusťte \deployed\client.exe a všimněte si očekávaného výstupu 1.0.0-C# nebo "1.0.0-VB.NET".

Krok 6

Tento názorný postup se týká registrace modelu COM, takže teď potřebujeme zrušit registraci sestavení SideBySide. Na příkazovém řádku sady Visual Studio 2003 přejděte do složky \deployed a spusťte příkaz: regasm /u SideBySide.dll.

Krok 7

Pokud chcete zjistit, jaký vliv má předchozí krok, spusťte \deployed\client.exe znovu a zobrazí se zpráva Třída není zaregistrovaná nebo Chyba za běhu 429: Komponenta ActiveX nemůže vytvořit objekt. V této fázi jsme frustrovali modul runtime modelu COM od vyhledání informací, které potřebuje v registru, ale zatím jsme tyto informace zpřístupnit alternativními způsoby. V následujících krocích to napravíme.

Aktivace Registration-Free

Krok 8

Ve složce \nasazená vytvořte soubor manifestu aplikace (textový soubor) pro client.exe aplikaci a zavolejte ho client.exe.manifest. Do souboru vložte následující:

<?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

Ve složce projektu SideBySide vytvořte soubor manifestu privátního sestavení (textový soubor) a zavolejte ho SideBySide.manifest. Do souboru vložte následující:

<?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>

Dalším úkolem je vložit výše uvedený soubor manifestu sestavení do SideBySide sestavení jako prostředek Win32. V době psaní je to povinné pro systém Windows XP, ale ne pro Systém Windows Server 2003. V systému Windows Server 2003 můžete můžete jednoduše nasadit soubor manifestu sestavení společně se sestavením. Nicméně, vyzývám vás, abyste nezávisel na tomto chování, protože se může dobře změnit v nadcházející aktualizaci Windows Server 2003 Service Pack. Abyste měli jistotu, že budete v budoucnu podporovat obě platformy, postupujte podle následujících několika kroků a vložte soubor manifestu sestavení do sestavení .NET jako prostředek Win32. To je nezbytné pouze pro registraci bez registrace . Komponenty založené na technologii NET a nejsou požadavkem na aktivaci nativních komponent modelu COM bez registrace.

Krok 10

Ve složce projektu SideBySide vytvořte soubor skriptu definice prostředku (textový soubor) a zavolejte ho SideBySide.rc. Do souboru vložte následující:

#include <windows.h>
#define MANIFEST_RESOURCE_ID 1
MANIFEST_RESOURCE_ID RT_MANIFEST SideBySide.manifest

Soubor windows.h a jeho závislosti jsou k dispozici, když nainstalujete sadu Sdk platformy (část Core SDK) nebo Visual C++. Část windows.h, která je zde požadována, je definice:

#define RT_MANIFEST 24

V důsledku toho se obsah SideBySide.rc přeloží na:

1 24 SideBySide.manifest

Je ale jasnější a obecnější používat definice maker podle pokynů.

Krok 11

Ve složce SideBySide projektu vytvořte soubor příkazu sestavení (textový soubor) a zavolejte ho build.cmd. Do souboru vložte následující:

sestavení jazyka C#:

rc SideBySide.rc
csc /t:library /out:..\deployed\SideBySide.dll 
/win32res:SideBySide.res Class1.cs

Sestavení .NET jazyka Visual Basic:

rc SideBySide.rc
vbc /t:library /out:..\deployed\SideBySide.dll 
/win32resource:SideBySide.res /rootnamespace:SideBySide Class1.vb

Co tyto příkazy dělají, je nejprve vyvolat nástroj Microsoft Windows Resource Compiler ze sady Sdk platformy (rc.exe) ke kompilaci skriptu definice prostředku z kroku 10 do zkompilovaného souboru prostředků s názvem SideBySide.res. Dále vyvolá kompilátor jazyka C# nebo Visual Basic .NET, který sestaví soubor zdrojového kódu do sestavení a vloží do něj zkompilovaný soubor prostředků jako prostředek Win32. Kompilované sestavení se zapíše do složky \deployed, ale není zaregistrované pro zprostředkovatele komunikace s objektem COM.

Krok 12

Na příkazovém řádku sady Visual Studio 2003 přejděte do složky projektu SideBySide a spusťte příkaz: build.

Krok 13

Chcete-li ověřit, zda je váš klient opět schopen aktivovat třídu SideBySideClass prostřednictvím zprostředkovatele komunikace COM, spustit \deployed\client.exe a poznamenat očekávaný výstup "1.0.0-C#" nebo "1.0.0-VB.NET".

Řešení problémů

Jak jsme viděli, registrace bez registrace komponent založených na rozhraní .NET Framework nevyžaduje žádný speciální kód na serveru nebo v klientovi. Vše, co je potřeba, je odpovídající dvojice souborů manifestu, z nichž jedna je vložena do sestavení .NET jako prostředek Win32 typu RT_MANIFEST.

Navrhuji vám přístup k vlastnímu vývoji bez registrace způsobem, jak to tento návod dělá. Konkrétně: nejprve se dostanete ke známému stavu tím, že uvidíte, že váš klient pracuje s registrovaným serverem; pak zrušte registraci serveru a potvrďte, že vaše chybová zpráva je to, co byste očekávali; a konečně napravit situaci vytvářením a nasazováním souborů manifestu. Tímto způsobem se vaše úsilí při řešení potíží s aktivací bez registrace omezí na strukturu souborů manifestu a správné vložení manifestu sestavení.

Při řešení problémů modelu COM bez registrace je prohlížeč událostí v systému Windows Server 2003 váš přítel. Když systém Windows XP nebo Windows Server 2003 zjistí chybu konfigurace, obvykle se zobrazí okno s chybovou zprávou s názvem aplikace, kterou jste spustili, a obsahuje zprávu "Tato aplikace se nepodařilo spustit, protože konfigurace aplikace není správná. Přeinstalace aplikace může tento problém vyřešit." Doporučuji, že kdykoli uvidíte tuto zprávu, reprodukujete problém v systému Windows Server 2003, podívejte se do protokolu událostí systému a vyhledejte události z SideBySide zdroj. Důvod, proč nenavrhuji, abyste se v těchto případech podívali na protokol událostí XP je, že bude vždy obsahovat zprávu, jako je například "Vygenerovat kontext aktivace selhal pro [path]\[název_souboru aplikace]. Manifest. Referenční chybová zpráva: Operace se úspěšně dokončila, což nepomůže identifikovat problém.

Než přejdeme na strukturu souborů manifestu, promluvme si o prostředcích Win32. Jak už jsme zmínili výše, windows.h definuje symbol RT_MANIFEST jako hodnotu 24, což je hodnota, kterou operační systém rozpozná jako vložený soubor manifestu. Pokud zapomenete do skriptu definice prostředku (.rc) zahrnout windows.h, sestavení bude stále úspěšné a soubor manifestu bude stále vložen jako prostředek, ale ne správný typ. Chcete-li ověřit, zda máte správně vložený jeho manifest, otevřete SideBySide.dll v sadě Visual Studio (File | Otevřít | Soubor...). Zobrazí se stromové zobrazení zobrazující prostředky v modulu. Pod kořenovým uzlem by měl být uzel s názvem RT_MANIFEST, pod kterým by měl být jiný uzel s číslem prostředku manifestu (1 v návodu). Poklikáním na tento poslední uzel zobrazíte data v binárním zobrazení a získáte rychlou kontrolu sanity, že se podobá souboru manifestu XML. I když je binární, znaky z rozsahu ASCII budou zřejmé. Pokud binární data chybí nebo vypadají nesprávně, ověřte, že váš skript definice prostředku (.rc) odkazuje na váš soubor manifestu. Pokud je text uzlu RT_MANIFEST v uvozovkách, pravděpodobně jste zapomněli do skriptu definice prostředku (.rc) zahrnout windows.h.

Každá z uvedených chyb bude hlášena v protokolu událostí systému Windows Server 2003 se zprávou: "Závislé sestavení [název] nebylo nalezeno a poslední chyba: Odkazované sestavení není nainstalováno ve vašem systému."

Schémata různých souborů manifestu jsou zdokumentovaná v sadě SDK platformy pod nadpisem Soubory manifestu Referenčnía nástroj pro ověření schématu Manifestchk.vbs je k dispozici, takže zde budu popisovat pouze několik bodů relevantních pro návod. Nejprve se podíváme na soubor manifestu sestavení. Podívejte se například zpět na krok 9.

Vzpomeňte si, že v registrační smyslu je sestavení abstraktní myšlenkou, ke které přidružíte jeden nebo více fyzických souborů prostřednictvím obsahu manifestu sestavení souboru.

Element assemblyIdentity definuje identitusestavení . Pro. Komponenty založené na technologii NET, které název atributu, musí odpovídat názvu sestavení .NET a jeho názvu souboru, jinak se v protokolu událostí systému Windows Server 2003 zobrazí následující zpráva: "Závislé sestavení [hodnota název atributu] nelze najít a poslední chyba byla Odkazovaná sestavení není nainstalována ve vašem systému." Atribut verze však nemusí odpovídat assemblyVersion rozhraní .NET, ani jeho AssemblyFileVersion, i když je vhodné použít nějaký druh konzistence.

Element clrClass má pouze dva povinné atributy: název a clsid. Atribut názvu musí odpovídat kombinovanému oboru názvů a názvu třídy aktivované třídy CLR. Pokud ne, vrátí funkce CoCreateInstance hodnotu HRESULT s hodnotou COR_E_TYPELOAD (0x80131522). Výsledkem je vyvolána výjimka System.TypeLoadException, když zavaděč typů nenajde požadovaný typ CLR v sestavení .NET. Jednou z věcí, kterou je potřeba sledovat, jestli je sestavení .NET napsané v jazyce Visual Basic .NET, je, že do příkazového řádku do kompilátoru .NET jazyka Visual Basic (vbc.exe) zadáte přepínač /rootnamespace. Atribut clsidmusí odpovídat CLSID přiřazené třídě CLR aktivované prostřednictvím atributu GuidAttribute. Pokud ne, vrátí funkce CoCreateInstance hodnotu HRESULT s hodnotou REGDB_E_CLASSNOTREG (0x80040154), text zprávy, pro kterou není zaregistrovaná třída.

Teď se podíváme na soubor manifestu aplikace. Podívejte se například zpět na krok 8. manifest aplikace musí mít název ve formátu [název_souboru aplikace].manifest. V návodu se tedy jmenovala client.exe.manifest, aby bylo jasné, že by se měla číst při každém načtení client.exe do procesu. Pokud se to neprovede správně, vrátí funkce CoCreateInstance hodnotu HRESULT s hodnotou REGDB_E_CLASSNOTREG (0x80040154), text zprávy, pro kterou není zaregistrovaná třída.

Nejdůležitějším prvkem v manifestu aplikace je dependentAssembly/assemblyIdentity element. Tento prvek je odkaz na ekvivalentní jeden v manifestu sestavení a oba musí odpovídat přesně. Dobrým způsobem, jak zajistit, aby to udělali, je zkopírovat prvek z manifestu sestavení a vložit ho sem. Pokud existuje jakýkoli rozdíl, zobrazí se v protokolu událostí systému Windows Server 2003 následující zpráva: "Identita komponenty nalezená v manifestu neodpovídá identitě požadované komponenty."

Závěr

Com bez registrace je technologie, která uvolní komponenty MODELU COM ze závislosti na registru Windows a v důsledku toho uvolní aplikace, které je používají, od vyžadování vyhrazených serverů. Umožňuje aplikacím se závislostmi na různých verzích stejné komponenty MODELU COM sdílet infrastrukturu a načíst tyto různé verze komponent MODELU COM vedle sebe v ozvěně mechanismu správy verzí a nasazení .NET.

Tento článek vás provede ukázkou registrace bezplatné aktivace komponent založených na rozhraní .NET Framework nativními klientskými aplikacemi napsanými v jazyce Visual C++ a Visual Basic 6.0. Vysvětlila některé z toho, jak mechanismus funguje, a podtrhl některé možné chyby konfigurace a způsob jejich řešení.

Další čtení

 

o autorovi

Steve White je konzultant pro vývoj aplikací pracující v týmu Premier Support for Developers v Microsoft UK. Podporuje vývoj zákazníků pomocí Visual C#, Windows Forms a ASP.NET. Jeho blog má více informací o jeho zájmech o hudbu, vizualizace a programování.

Leslie Muller je technik s týmem Research & Development v Credit Suisse First Boston. Leslie má 12 let zkušeností jako vývojář a technický architekt, pracující v prostředích, jako jsou finanční služby, technologické startupy, průmyslová automatizace a obrana. Když neprogramuje ani neprovádí výzkum, baví se lyžování, hokej a když je to možné trochu šílené věci s motorizovanými vozidly v extrémních prostředích, jako je Island nebo Rockies.