Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Замечание
Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Начиная с .NET Framework 4, вы можете использовать параллельное размещение для запуска нескольких версий среды CLR в одном процессе. По умолчанию управляемые com-компоненты выполняются с версией .NET Framework, с которыми они были созданы независимо от версии .NET Framework, загруженной для процесса.
Предыстория
Платформа .NET Framework всегда предоставляла возможность параллельного размещения для управляемых приложений, но до версии .NET Framework 4 она не обеспечивала такую функциональность для управляемых компонентов COM. В прошлом управляемые com-компоненты, загруженные в процесс, выполнялись либо с версией среды выполнения, которая уже загружена, либо с последней установленной версией .NET Framework. Если эта версия не совместима с COM-компонентом, компонент не удастся.
Платформа .NET Framework 4 предоставляет новый подход к параллельному размещению, который гарантирует следующее:
Установка новой версии .NET Framework не влияет на существующие приложения.
Приложения выполняются с версией платформы .NET Framework, с помощью которую они были созданы. Они не используют новую версию платформы .NET Framework, если им не будет дано явного указания. Однако для приложений проще перейти на новую версию .NET Framework.
Влияние на пользователей и разработчиков
Конечные пользователи и системные администраторы. Теперь эти пользователи могут иметь большую уверенность в том, что при установке новой версии среды выполнения независимо или с приложением он не будет влиять на компьютеры. Существующие приложения будут продолжать работать, как и раньше.
Разработчики приложений. Параллельное размещение практически не влияет на разработчиков приложений. По умолчанию приложения всегда выполняются с версией .NET Framework, на которую они были созданы; это не изменилось. Однако разработчики могут переопределить это поведение и направить приложение на запуск в более новой версии .NET Framework (см. сценарий 2).
Разработчики библиотеки и потребители. Параллельное размещение не решает проблемы совместимости, с которыми сталкиваются разработчики библиотеки. Библиотека, которая загружается приложением напрямую — либо через прямую ссылку, либо через вызов Assembly.Load — продолжает использовать среду выполнения AppDomain, в которую она загружена. Вы должны протестировать библиотеки на всех версиях .NET Framework, которые вы хотите поддерживать. Если приложение компилируется с помощью среды выполнения .NET Framework 4, но включает библиотеку, созданную с помощью более ранней среды выполнения, эта библиотека также будет использовать среду выполнения .NET Framework 4. Однако если у вас есть приложение, созданное с помощью более ранней среды выполнения и библиотеки, созданной с помощью .NET Framework 4, необходимо принудительно принудить приложение также использовать .NET Framework 4 (см. сценарий 3).
Разработчики управляемых компонентов COM. В прошлом управляемые com-компоненты автоматически запускались с помощью последней версии среды выполнения, установленной на компьютере. Теперь вы можете выполнять COM-компоненты в версии среды выполнения, с которыми они были созданы.
Как показано в следующей таблице, компоненты, созданные с помощью .NET Framework версии 1.1, могут выполняться параллельно с компонентами версии 4, но они не могут работать с компонентами версии 2.0, 3.0 или 3.5, так как параллельное размещение недоступно для этих версий.
Версия платформы .NET Framework 1.1 2.0 - 3.5 4 1.1 Неприменимо нет Да 2.0 - 3.5 нет Неприменимо Да 4 Да Да Неприменимо
Замечание
.NET Framework версии 3.0 и 3.5 создаются постепенно в версии 2.0 и не должны выполняться параллельно. Это по сути одна и та же версия.
Распространенные сценарии параллельного размещения
Сценарий 1. Собственное приложение, использующее COM-компоненты, созданные с более ранними версиями .NET Framework.
Установленные версии .NET Framework: .NET Framework 4 и все остальные версии .NET Framework, используемые компонентами COM.
Что делать: в этом сценарии ничего не делать. Компоненты COM будут работать с версией .NET Framework, с которыми они были зарегистрированы.
Сценарий 2. Управляемое приложение, созданное с помощью .NET Framework 2.0 с пакетом обновления 1 (SP1), которое вы предпочитаете запускать с .NET Framework 2.0, но готовы работать в .NET Framework 4, если версия 2.0 отсутствует.
Установленные версии .NET Framework: более ранняя версия .NET Framework и .NET Framework 4.
Что делать: в файле конфигурации приложения в каталоге приложения используйте
<startup>элемент и<supportedRuntime>набор элементов следующим образом:<configuration> <startup > <supportedRuntime version="v2.0.50727" /> <supportedRuntime version="v4.0" /> </startup> </configuration>Сценарий 3. Собственное приложение, использующее COM-компоненты, созданные с более ранними версиями .NET Framework, которые необходимо запустить с .NET Framework 4.
Установленные версии .NET Framework: .NET Framework 4.
Что делать: В файле конфигурации приложения в каталоге приложения используйте элемент
<startup>с атрибутомuseLegacyV2RuntimeActivationPolicy, установленным наtrue, и элементом<supportedRuntime>, заданным следующим образом:<configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" /> </startup> </configuration>
Пример
В следующем примере демонстрируется неуправляемый COM-хост, на котором выполняется управляемый COM-компонент с использованием версии .NET Framework, для которой компонент был скомпилирован.
Чтобы выполнить следующий пример, скомпилируйте и зарегистрируйте следующий управляемый COM-компонент с помощью .NET Framework 3.5. Чтобы зарегистрировать компонент, в меню "Проект" выберите "Свойства", перейдите на вкладку "Сборка", а затем установите флажок "Регистрация для взаимодействия COM".
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);
}
}
}
Скомпилируйте следующее неуправляемое приложение C++, которое активирует COM-объект, созданный в предыдущем примере.
#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;
}