Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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útumauseLegacyV2RuntimeActivationPolicyértékre van állítvatrue, é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;
}