Prozessinterne parallele AusführungIn-Process Side-by-Side Execution

Ab .NET Framework 4.NET Framework 4 können Sie mit prozessinternem parallelem Hosting mehrere Versionen der Common Language Runtime (CLR) in einem einzelnen Prozess ausführen.Starting with the .NET Framework 4.NET Framework 4, you can use in-process side-by-side hosting to run multiple versions of the common language runtime (CLR) in a single process. Standardmäßig werden verwaltete COM-Komponenten mit der .NET Framework-Version ausgeführt, mit der sie erstellt wurden, unabhängig von der .NET Framework-Version, die für den Prozess geladen wird.By default, managed COM components run with the .NET Framework version they were built with, regardless of the .NET Framework version that is loaded for the process.

HintergrundBackground

Das .NET Framework bot schon immer paralleles Hosting für verwaltete Codeanwendungen, vor .NET Framework 4.NET Framework 4 gab es diese Funktion jedoch nicht für verwaltete COM-Komponenten.The .NET Framework has always provided side-by-side hosting for managed code applications, but before the .NET Framework 4.NET Framework 4, it did not provide that functionality for managed COM components. In der Vergangenheit wurden verwaltete COM-Komponenten, die in einen Prozess geladen wurden, entweder mit der Version der bereits geladenen Runtime oder mit der neuesten installierten Version von .NET Framework ausgeführt.In the past, managed COM components that were loaded into a process ran either with the version of the runtime that was already loaded or with the latest installed version of the .NET Framework. Wenn diese Version nicht mit der COM-Komponente kompatibel war, ist die Komponente fehlgeschlagen.If this version was not compatible with the COM component, the component would fail.

.NET Framework 4.NET Framework 4 bietet eine neue Herangehensweise des parallelen Hostings, wodurch Folgendes sichergestellt werden kann:The .NET Framework 4.NET Framework 4 provides a new approach to side-by-side hosting that ensures the following:

  • Die Installation einer neuen Version von .NET Framework hat keinen Einfluss auf vorhandene Anwendungen.Installing a new version of the .NET Framework has no effect on existing applications.

  • Anwendungen werden auf der Version des .NET Framework aufgeführt, mit dem sie erstellt wurden.Applications run against the version of the .NET Framework that they were built with. Sie verwenden nicht die neue Version des .NET Framework, es sei denn, es wird ausdrücklich darauf hingewiesen.They do not use the new version of the .NET Framework unless expressly directed to do so. Es ist für Anwendungen, zu der ein Übergang stattfindet, jedoch einfacher, eine neue Version von .NET Framework zu verwenden.However, it is easier for applications to transition to using a new version of the .NET Framework.

Auswirkungen auf Benutzer und EntwicklerEffects on Users and Developers

  • Endbenutzer und Systemadministratoren.End users and system administrators. Diese Benutzer können nun bei der Installation einer Version der Runtime sicherer sein, wenn sie diese entweder eigenständig oder mit einer Anwendung erstellen. Dies hat keinen Einfluss auf deren Computer.These users can now have greater confidence that when they install a new version of the runtime, either independently or with an application, it will have no impact on their computers. Vorhandene Anwendungen werden genauso wie vorher ausgeführt.Existing applications will continue to run as they did before.

  • Anwendungsentwickler.Application developers. Das parallele Hosting hat so gut wie keine Auswirkungen auf Anwendungsentwickler.Side-by-side hosting has almost no effect on application developers. Standardmäßig werden Anwendungen immer auf der Version des .NET Framework ausgeführt, auf dem sie erstellt wurden; dies hat sich nicht verändert.By default, applications always run against the version of the .NET Framework they were built on; this has not changed. Jedoch können Entwickler dieses Verhalten außer Kraft setzen und Anwendungen dazu bringen, unter einer neueren Version des .NET Framework zu laufen (siehe Szenario 2).However, developers can override this behavior and direct the application to run under a newer version of the .NET Framework (see scenario 2).

  • Bibliotheksentwickler und Consumer.Library developers and consumers. Das parallele Hosting löst nicht die Probleme mit der Kompatibilität, denen Bibliotheksentwickler gegenüberstehen.Side-by-side hosting does not solve the compatibility problems that library developers face. Eine Bibliothek, die direkt durch eine Anwendung geladen wird, entweder durch einen Direktverweis oder einen Assembly.Load-Aufruf, verwendet weiterhin die Runtime von AppDomain, in der sie geladen wurde.A library that is directly loaded by an application -- either through a direct reference or through an Assembly.Load call -- continues to use the runtime of the AppDomain it is loaded into. Sie sollten Ihre Bibliotheken für alle .NET Framework-Versionen testen, die Sie unterstützen möchten.You should test your libraries against all versions of the .NET Framework that you want to support. Wenn eine Anwendung mithilfe der .NET Framework 4.NET Framework 4-Runtime kompiliert wird, jedoch eine Bibliothek enthält, die mit einer früheren Runtime erstellt wurde, wird dies Bibliothek ebenso die .NET Framework 4.NET Framework 4-Runtime verwenden.If an application is compiled using the .NET Framework 4.NET Framework 4 runtime but includes a library that was built using an earlier runtime, that library will use the .NET Framework 4.NET Framework 4 runtime as well. Wenn Sie jedoch über eine Anwendung verfügen, die mithilfe einer früheren Runtime erstellt wurde, sowie eine Bibliothek, die mit .NET Framework 4.NET Framework 4 erstellt wurde, müssen Sie Ihre Anwendung dazu zwingen, auch .NET Framework 4.NET Framework 4 zu verwenden (siehe Szenario 3).However, if you have an application that was built using an earlier runtime and a library that was built using the .NET Framework 4.NET Framework 4, you must force your application to also use the .NET Framework 4.NET Framework 4 (see scenario 3).

  • Entwickler verwalteter COM-Komponenten.Managed COM component developers. Früher wurden die verwalteten COM-Komponenten automatisch mithilfe der aktuellsten Version der Runtime ausgeführt, die auf dem Computer installiert war.In the past, managed COM components automatically ran using the latest version of the runtime installed on the computer. Sie können nun COM-Komponenten für die Version der Runtime ausführen, mit der sie erstellt wurden.You can now execute COM components against the version of the runtime they were built with.

    So wie in der folgenden Tabelle gezeigt, können Komponenten, die mit der .NET Framework-Version 1.1 erstellt wurden, parallel mit Komponenten der Version 4 ausgeführt werden. Sie können jedoch nicht mit Komponenten der Version 2.0, 3.0 oder 3.5 ausgeführt werden, da das parallele Hosting für diese Versionen nicht verfügbar ist.As shown by the following table, components that were built with the .NET Framework version 1.1 can run side by side with version 4 components, but they cannot run with version 2.0, 3.0, or 3.5 components, because side-by-side hosting is not available for those versions.

    .NET Framework-Version.NET Framework version 1.11.1 2.0 - 3.52.0 - 3.5 44
    1.11.1 Nicht zutreffendNot applicable NeinNo JaYes
    2.0 - 3.52.0 - 3.5 NeinNo Nicht zutreffendNot applicable JaYes
    44 JaYes JaYes Nicht zutreffendNot applicable

Hinweis

.NET Framework-Versionen 3.0 und 3.5 werden inkrementell auf Version 2.0 erstellt und müssen nicht parallel ausgeführt werden..NET Framework versions 3.0 and 3.5 are built incrementally on version 2.0, and do not need to run side by side. Sie sind an und für sich dieselbe Version.These are inherently the same version.

Häufige Szenarios des parallelen HostingsCommon Side-by-Side Hosting Scenarios

  • Szenario 1: Native Anwendung, die COM-Komponenten verwendet, die mit früheren Versionen von .NET Framework erstellt wurden.Scenario 1: Native application that uses COM components built with earlier versions of the .NET Framework.

    Installierte .NET Framework-Versionen: Die .NET Framework 4.NET Framework 4 und alle anderen Versionen des .NET Framework, die von den COM-Komponenten verwendet werden..NET Framework versions installed: The .NET Framework 4.NET Framework 4 and all other versions of the .NET Framework used by the COM components.

    Das muss ich tun: In diesem Szenario unternehmen Sie nichts.What to do: In this scenario, do nothing. Die COM-Komponenten werden mit der Version des .NET Framework ausgeführt, mit der sie registriert wurden.The COM components will run with the version of the .NET Framework they were registered with.

  • Szenario 2: Verwaltete Anwendung, die mit .NET Framework 2.0 SP1.NET Framework 2.0 SP1 erstellt wurde, die lieber mit .NET Framework 2.0.NET Framework 2.0 ausgeführt werden soll, jedoch auch unter .NET Framework 4.NET Framework 4 ausgeführt werden kann, wenn Version 2.0 nicht verfügbar ist.Scenario 2: Managed application built with the .NET Framework 2.0 SP1.NET Framework 2.0 SP1 that you would prefer to run with the .NET Framework 2.0.NET Framework 2.0, but are willing to run on the .NET Framework 4.NET Framework 4 if version 2.0 is not present.

    Installierte .NET Framework-Version: Eine frühere Version von .NET Framework und .NET Framework 4.NET Framework 4..NET Framework versions installed: An earlier version of the .NET Framework and the .NET Framework 4.NET Framework 4.

    Vorgehensweise: Verwenden Sie in der Anwendungskonfigurationsdatei im Anwendungsverzeichnis das <startup>-Element und das <supportedRuntime>-Element, die wie folgt festgelegt sind:What to do: In the application configuration file in the application directory, use the <startup> element and the <supportedRuntime> element set as follows:

    <configuration>  
      <startup >  
        <supportedRuntime version="v2.0.50727" />  
        <supportedRuntime version="v4.0" />  
      </startup>  
    </configuration>  
    
  • Szenario 3: Native Anwendung, die COM-Komponenten verwendet, die mit früheren Versionen von .NET Framework erstellt wurden, die Sie mit .NET Framework 4.NET Framework 4 ausführen möchten.Scenario 3: Native application that uses COM components built with earlier versions of the .NET Framework that you want to run with the .NET Framework 4.NET Framework 4.

    Installierte .NET Framework-Versionen: .NET Framework 4.NET Framework 4.NET Framework versions installed: The .NET Framework 4.NET Framework 4.

    Vorgehensweise: Verwenden Sie in der Anwendungskonfigurationsdatei im Anwendungsverzeichnis das <startup>-Element, mit mit dem useLegacyV2RuntimeActivationPolicy-Attribut, das auf true festgelegt ist, sowie das <supportedRuntime>-Element, das wie folgt festgelegt ist:What to do: In the application configuration file in the application directory, use the <startup> element with the useLegacyV2RuntimeActivationPolicy attribute set to true and the <supportedRuntime> element set as follows:

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

BeispielExample

Das folgende Beispiel stellt einen nicht verwalteten COM-Host dar, der eine verwaltete COM-Komponente mithilfe der Version von .NET Framework ausführt, für deren Verwendung die Komponente kompiliert wurde.The following example demonstrates an unmanaged COM host that is running a managed COM component by using the version of the .NET Framework that the component was compiled to use.

Um das folgende Beispiel auszuführen, kompilieren und registrieren Sie die folgende verwaltete COM-Komponente mithilfe von .NET Framework 3,5.NET Framework 3.5.To run the following example, compile and register the following managed COM component using the .NET Framework 3,5.NET Framework 3.5. Um die Komponente zu registrieren, klicken Sie im Projekt-Menü auf Eigenschaften, auf die Registerkarte Erstellen, und aktivieren Sie dann das Kontrollkästchen Für COM-Interop registrieren.To register the component, on the Project menu, click Properties, click the Build tab, and then select the Register for COM interop check box.

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

Kompilieren Sie die folgende nicht verwaltete C++-Anwendung, die das COM-Objekt aktiviert, das durch das vorherige Beispiel erstellt wurde.Compile the following unmanaged C++ application, which activates the COM object that is created by the previous example.

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

Siehe auchSee Also

<startup>-Element<startup> Element
<supportedRuntime> Element<supportedRuntime> Element