Devam Eden Yan Yana Yürütme
Not
Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.
.NET Framework 4'den başlayarak, ortak dil çalışma zamanının (CLR) birden çok sürümünü tek bir işlemde çalıştırmak için işlem içi yan yana barındırmayı kullanabilirsiniz. Varsayılan olarak, yönetilen COM bileşenleri, işlem için yüklenen .NET Framework sürümünden bağımsız olarak, birlikte oluşturuldukları .NET Framework sürümüyle çalışır.
Background
.NET Framework, yönetilen kod uygulamaları için her zaman yan yana barındırma sağlamıştır, ancak .NET Framework 4'ün öncesinde yönetilen COM bileşenleri için bu işlevselliği sağlamamıştır. Geçmişte, bir işleme yüklenen yönetilen COM bileşenleri, zaten yüklenmiş olan çalışma zamanının sürümüyle veya .NET Framework'ün en son yüklü sürümüyle çalışıyordu. Bu sürüm COM bileşeniyle uyumlu değilse bileşen başarısız olur.
.NET Framework 4, aşağıdakileri sağlayan yeni bir yan yana barındırma yaklaşımı sağlar:
.NET Framework'ün yeni bir sürümünü yüklemenin mevcut uygulamalar üzerinde hiçbir etkisi yoktur.
Uygulamalar, birlikte oluşturuldukları .NET Framework sürümüyle çalışır. Açıkça yönlendirilmediği sürece .NET Framework'ün yeni sürümünü kullanmaz. Ancak, uygulamaların .NET Framework'ün yeni bir sürümünü kullanmaya geçiş yapmak daha kolaydır.
Kullanıcılar ve Geliştiriciler Üzerindeki Etkileri
Son kullanıcılar ve sistem yöneticileri. Bu kullanıcılar artık çalışma zamanının bağımsız olarak veya bir uygulamayla yeni bir sürümünü yüklediklerinde bilgisayarlarını etkilemeyeceği konusunda daha fazla güvene sahip olabilirler. Mevcut uygulamalar daha önce olduğu gibi çalışmaya devam edecektir.
Uygulama geliştiricileri. Yan yana barındırmanın uygulama geliştiricileri üzerinde neredeyse hiçbir etkisi yoktur. Varsayılan olarak, uygulamalar her zaman üzerinde oluşturuldukları .NET Framework sürümüne göre çalışır; bu değişmedi. Ancak geliştiriciler bu davranışı geçersiz kılabilir ve uygulamayı .NET Framework'ün daha yeni bir sürümü altında çalışmaya yönlendirebilir (bkz . senaryo 2).
Kitaplık geliştiricileri ve tüketicileri. Yan yana barındırma, kitaplık geliştiricilerinin karşılaştığı uyumluluk sorunlarını çözmez. Doğrudan başvuru veya çağrı aracılığıyla bir uygulama tarafından doğrudan yüklenen bir Assembly.Load kitaplık, yüklendiği çalışma zamanını AppDomain kullanmaya devam eder. Kitaplıklarınızı desteklemek istediğiniz .NET Framework'ün tüm sürümleriyle test etmelisiniz. Bir uygulama .NET Framework 4 çalışma zamanı kullanılarak derlenmişse ancak önceki bir çalışma zamanı kullanılarak oluşturulmuş bir kitaplık içeriyorsa, bu kitaplık .NET Framework 4 çalışma zamanını da kullanır. Ancak, önceki bir çalışma zamanı kullanılarak oluşturulmuş bir uygulamanız ve .NET Framework 4 kullanılarak oluşturulmuş bir kitaplığınız varsa, uygulamanızı .NET Framework 4'ün de kullanılmasına zorlamanız gerekir (bkz . senaryo 3).
Yönetilen COM bileşeni geliştiricileri. Geçmişte, yönetilen COM bileşenleri bilgisayarda yüklü olan çalışma zamanının en son sürümünü kullanarak otomatik olarak çalıştırılırdı. Artık COM bileşenlerini, birlikte oluşturuldukları çalışma zamanının sürümüne göre yürütebilirsiniz.
Aşağıdaki tabloda gösterildiği gibi, .NET Framework sürüm 1.1 ile oluşturulmuş bileşenler sürüm 4 bileşenleriyle yan yana çalışabilir, ancak bu sürümler için yan yana barındırma kullanılamadığından sürüm 2.0, 3.0 veya 3.5 bileşenleriyle çalıştırılamaz.
.NET Framework sürümü 1.1 2.0 - 3.5 4 1.1 Uygulanamaz Hayır Evet 2.0 - 3.5 Hayır Uygulanamaz Yes 4 Yes Evet Uygulanamaz
Not
.NET Framework 3.0 ve 3.5 sürümleri, sürüm 2.0'da artımlı olarak oluşturulur ve yan yana çalıştırılması gerekmez. Bunlar doğal olarak aynı sürümdür.
Ortak Yan Yana Barındırma Senaryoları
Senaryo 1: .NET Framework'ün önceki sürümleriyle oluşturulmuş COM bileşenlerini kullanan yerel uygulama.
.NET Framework sürümleri yüklü: .NET Framework 4 ve COM bileşenleri tarafından kullanılan .NET Framework'ün diğer tüm sürümleri.
Yapılması gerekenler: Bu senaryoda hiçbir şey yapma. COM bileşenleri, kayıtlı oldukları .NET Framework sürümüyle çalışır.
Senaryo 2: .NET Framework 2.0 SP1 ile oluşturulan ve .NET Framework 2.0 ile çalıştırmayı tercih ettiğiniz ancak sürüm 2.0 yoksa .NET Framework 4'te çalışmaya istekli olan yönetilen uygulama.
.NET Framework sürümleri yüklü: .NET Framework ve .NET Framework 4'ün önceki bir sürümü.
Ne yapmalı: Uygulama dizinindeki uygulama yapılandırma dosyasında başlangıç öğesini ve <supportedRuntime> öğesi kümesini aşağıdaki gibi kullanın<>:
<configuration> <startup > <supportedRuntime version="v2.0.50727" /> <supportedRuntime version="v4.0" /> </startup> </configuration>
Senaryo 3: .NET Framework 4 ile çalıştırmak istediğiniz .NET Framework'ün önceki sürümleriyle oluşturulmuş COM bileşenlerini kullanan yerel uygulama.
.NET Framework sürümleri yüklü: .NET Framework 4.
Yapılması gerekenler: Uygulama dizinindeki uygulama yapılandırma dosyasında öğesini özniteliği ve öğesi şu şekilde ayarlanmış şekilde kullanın
<startup>
useLegacyV2RuntimeActivationPolicy
:<supportedRuntime>
true
<configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" /> </startup> </configuration>
Örnek
Aşağıdaki örnekte, bileşenin kullanmak üzere derlendiği .NET Framework sürümünü kullanarak yönetilen bir COM bileşeni çalıştıran yönetilmeyen bir COM konağı gösterilmektedir.
Aşağıdaki örneği çalıştırmak için .NET Framework 3.5 kullanarak aşağıdaki yönetilen COM bileşenini derleyin ve kaydedin. Bileşeni kaydetmek için, Proje menüsünde Özellikler'e tıklayın, Oluştur sekmesine tıklayın ve com birlikte çalışma için kaydol onay kutusunu seçin.
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);
}
}
}
Önceki örnek tarafından oluşturulan COM nesnesini etkinleştiren aşağıdaki yönetilmeyen C++ uygulamasını derleyin.
#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;
}