Megosztás:


In-Process egymás melletti végrehajtás

Megjegyzés:

Ez a cikk a .NET-keretrendszerre vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A .NET-keretrendszer 4-től kezdve a folyamaton belüli üzemeltetéssel futtathatja a közös nyelvi futtatókörnyezet (CLR) több verzióját egyetlen folyamatban. A felügyelt COM-összetevők alapértelmezés szerint azzal a .NET-keretrendszerverzióval futnak, amellyel készültek, függetlenül a folyamathoz betöltött .NET-keretrendszer verziótól.

Háttér

A .NET-keretrendszer mindig egymás mellett üzemeltette a felügyelt kódalkalmazásokat, de a .NET-keretrendszer 4 előtt nem biztosította ezt a funkciót a felügyelt COM-összetevők számára. Korábban a folyamatba betöltött felügyelt COM-összetevők a futtatókörnyezet már betöltött verziójával vagy a .NET-keretrendszer legújabb telepített verziójával futottak. Ha ez a verzió nem kompatibilis a COM-összetevővel, az összetevő sikertelen lesz.

A .NET-keretrendszer 4 új megközelítést biztosít a párhuzamos üzemeltetéshez, amely a következőket biztosítja:

  • A .NET-keretrendszer új verziójának telepítése nincs hatással a meglévő alkalmazásokra.

  • Az alkalmazások a .NET-keretrendszer azon verzióján futnak, amellyel azokat készítették. Csak akkor használják a .NET-keretrendszer új verzióját, ha kifejezetten erre utasítják őket. Az alkalmazások azonban egyszerűbben váltanak a .NET-keretrendszer új verziójára.

Felhasználókra és fejlesztőkre gyakorolt hatások

  • Végfelhasználók és rendszergazdák. Ezek a felhasználók most már nagyobb mértékben biztosak lehetnek abban, hogy ha a futtatókörnyezet új verzióját telepítik függetlenül vagy egy alkalmazással, az nem lesz hatással a számítógépükre. A meglévő alkalmazások továbbra is ugyanúgy fognak futni, mint korábban.

  • Alkalmazásfejlesztők. Az egymás melletti üzemeltetés szinte semmilyen hatással nincs az alkalmazásfejlesztőkre. Alapértelmezés szerint az alkalmazások mindig a .NET-keretrendszer azon verzióján futnak, amelyre épültek; ez nem változott. A fejlesztők azonban felülbírálhatják ezt a viselkedést, és irányíthatják az alkalmazást a .NET-keretrendszer újabb verziójának futtatására (lásd a 2. forgatókönyvet).

  • Könyvtárfejlesztők és -felhasználók. A párhuzamos üzemeltetés nem oldja meg a könyvtárfejlesztők kompatibilitási problémáit. Az alkalmazás által közvetlenül betöltött könyvtár – akár közvetlen hivatkozással, akár hívással Assembly.Load – továbbra is azt a futtatókörnyezetet AppDomain használja, amibe betöltve van. Tesztelje a kódtárakat a támogatni kívánt .NET-keretrendszer összes verzióján. Ha egy alkalmazás a .NET-keretrendszer 4-futtatókörnyezetével van lefordítva, de tartalmaz egy korábbi futtatókörnyezetet használó kódtárat, akkor az adott kódtár a .NET-keretrendszer 4-futtatókörnyezetét is használni fogja. Ha azonban egy korábbi futtatókörnyezet és egy .NET-keretrendszer 4 használatával készült kódtár használatával készült alkalmazással rendelkezik, az alkalmazást a .NET-keretrendszer 4 használatára is kényszerítenie kell (lásd a 3. forgatókönyvet).

  • Felügyelt COM-összetevők fejlesztésében részt vevő fejlesztők. Korábban a felügyelt COM-összetevők automatikusan a számítógépre telepített futtatókörnyezet legújabb verziójával futottak. Mostantól a COM-összetevőket az általuk készített futtatókörnyezet verziójával hajthatja végre.

    Ahogy az alábbi táblázat is mutatja, az .NET-keretrendszer 1.1-es verziójával készült összetevők a 4-es verziójú összetevőkkel párhuzamosan futhatnak, de nem futtathatók a 2.0-s, 3.0-s vagy 3.5-ös verziójú összetevőkkel, mert ezekhez a verziókhoz nem érhető el egymás mellett üzemeltetés.

    .NET-keretrendszer verziója 1.1 2.0 - 3.5 4
    1.1 Nem alkalmazható Nem Igen
    2.0 - 3.5 Nem Nem alkalmazható Igen
    4 Igen Igen Nem alkalmazható

Megjegyzés:

A .NET-keretrendszer 3.0-s és 3.5-ös verziói növekményesen készülnek a 2.0-s verzióra, és nem kell egymás mellett futniuk. Ezek eredendően azonos verziójúak.

Gyakori párhuzamos üzemeltetési forgatókönyvek

  • 1. forgatókönyv: A .NET-keretrendszer korábbi verzióival készült COM-összetevőket használó natív alkalmazás.

    Telepített .NET-keretrendszerverziók: A .NET-keretrendszer 4 és a COM-összetevők által használt .NET-keretrendszer összes többi verziója.

    Teendők: Ebben a forgatókönyvben ne tegyen semmit. A COM-összetevők az általuk regisztrált .NET-keretrendszer verziójával fognak futni.

  • 2. forgatókönyv: A .NET-keretrendszer 2.0 SP1-es verziójával készült felügyelt alkalmazás, amelyet a .NET-keretrendszer 2.0-val szeretne futtatni, de hajlandó a .NET-keretrendszer 4-es verzióján futtatni, ha a 2.0-s verzió nem jelenik meg.

    Telepített .NET-keretrendszerverziók: A .NET-keretrendszer és a .NET-keretrendszer 4 korábbi verziója.

    Teendők: Az alkalmazás könyvtárában található alkalmazáskonfigurációs fájlban használja az <startup> elemet és az elemkészletet az <supportedRuntime> alábbiak szerint:

    <configuration>
      <startup >
        <supportedRuntime version="v2.0.50727" />
        <supportedRuntime version="v4.0" />
      </startup>
    </configuration>
    
  • 3. forgatókönyv: A .NET-keretrendszer korábbi verzióival készült COM-összetevőket használó natív alkalmazás, amelyet a .NET-keretrendszer 4-vel szeretne futtatni.

    A .NET-keretrendszer telepített verziói: A .NET-keretrendszer 4.

    Teendő: Az alkalmazáskönyvtár alkalmazáskonfigurációs fájljában használja az <startup> elemet, amelynek attribútuma useLegacyV2RuntimeActivationPolicy értékre van állítva true, és az <supportedRuntime> elemet az alábbiak szerint állítsa be:

    <configuration>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" />
      </startup>
    </configuration>
    

példa

Az alábbi példa egy nem felügyelt COM-gazdagépet mutat be, amely egy felügyelt COM-összetevőt futtat az összetevő által lefordított .NET-keretrendszer verziójával.

Az alábbi példa futtatásához fordítsa le és regisztrálja a következő felügyelt COM-összetevőt a .NET Framework 3.5 használatával. Az összetevő regisztrálásához kattintson a Project menü Tulajdonságok gombjára, kattintson a Build fülre , majd jelölje be a Regisztrálás COM-beli interophoz jelölőnégyzetet.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace BasicComObject
{
    [ComVisible(true), Guid("9C99C4B5-CA54-4c58-8988-49B6811BA53B")]
    public class MyObject : SimpleObjectModel.IPrintInfo
    {
        public MyObject()
        {
        }
        public void PrintInfo()
        {
            Console.WriteLine("MyObject was activated in {0} runtime in:\n\tAppDomain {1}:{2}", System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion(), AppDomain.CurrentDomain.Id, AppDomain.CurrentDomain.FriendlyName);
        }
    }
}

Fordítsa le a következő nem felügyelt C++ alkalmazást, amely aktiválja az előző példában létrehozott COM-objektumot.

#include "stdafx.h"
#include <string>
#include <iostream>
#include <objbase.h>
#include <string.h>
#include <process.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char input;
    CoInitialize(NULL) ;
    CLSID clsid;
    HRESULT hr;
    HRESULT clsidhr = CLSIDFromString(L"{9C99C4B5-CA54-4c58-8988-49B6811BA53B}",&clsid);
    hr = -1;
    if (FAILED(clsidhr))
    {
        printf("Failed to construct CLSID from String\n");
    }
    UUID id = __uuidof(IUnknown);
    IUnknown * pUnk = NULL;
    hr = ::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,id,(void **) &pUnk);
    if (FAILED(hr))
    {
        printf("Failed CoCreateInstance\n");
    }else
    {
        pUnk->AddRef();
        printf("Succeeded\n");
    }

    DISPID dispid;
    IDispatch* pPrintInfo;
    pUnk->QueryInterface(IID_IDispatch, (void**)&pPrintInfo);
    OLECHAR FAR* szMethod[1];
    szMethod[0]=OLESTR("PrintInfo");
    hr = pPrintInfo->GetIDsOfNames(IID_NULL,szMethod, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
    DISPPARAMS dispparams;
    dispparams.cNamedArgs = 0;
    dispparams.cArgs = 0;
    VARIANTARG* pvarg = NULL;
    EXCEPINFO * pexcepinfo = NULL;
    WORD wFlags = DISPATCH_METHOD ;
;
    LPVARIANT pvRet = NULL;
    UINT * pnArgErr = NULL;
    hr = pPrintInfo->Invoke(dispid,IID_NULL, LOCALE_USER_DEFAULT, wFlags,
        &dispparams, pvRet, pexcepinfo, pnArgErr);
    printf("Press Enter to exit");
    scanf_s("%c",&input);
    CoUninitialize();
    return 0;
}

Lásd még