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í
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
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
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
Element clrClass
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í
- aktivace komponent modelu COM Registration-Free: Návod
- izolované aplikace a souběžná sestavení
- schématu souboru manifestu
- pomocí rozhraní API kontextu aktivace
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.