Hata: Visual C++ bileşeni uzantıları kullandığınızda AppDomainUnloaded özel durum yönetilen...

Makale çevirileri Makale çevirileri
Makale numarası: 309694 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Çağrı yönetilmeyen kod içinde tek bir DLL DOSYASıNı doğrudan yönetilen için yönetilmeyen aramaları da dahil olmak üzere, yönetilen kod yapıldığında, bu sorun oluşur. Örneğin, bu sorun oluşabilir, MEC + +/ IJW ASP.NET'te kullanılan uygulamalar. ASP.NET'te, çeşitli olayları, uygulamaların yeni bir AppDomain yeniden yüklenmesi neden olabilir. Bu uygulamada MEC ++ bileşenleri ve IJW kullanıyorsanız, AppDomainUnloadException hata iletisi alabilirsiniz.

Neden

C++ derleyicisi kullanarak oluşturduğunuz yönetilen bir DLL DOSYASıNı yüklediğinde, IJW uygulamasının bir parçası olarak, çal??ma zaman? thunks geçişleri için yönetilmeyen kod için yönetilen kod oluşturur. Bu thunks, DLL yükler uygulama etki alanı için bir başvuru içerir. DLL yeniden yüklenirse, çalıştırma modülünün bu thunks yeniden değil; ayrıca, çalışma zamanı başvuru özgün uygulama etki alanı kaldırır ve başka bir AppDomain içinde DLL yükler güncelleştirmez.

Program bir geçiş yönetilmeyen kod yönetilen kod, güncel olmayan uygulama başvuru yönetilen kod çalıştırma için programın kullandığı gerçekleştirdiğinde. Özgün uygulama halen yüklü olsa bile kodu alanları, uygulama için özel olduğundan statik alanları erişemiyor.

Pratik Çözüm

Aşağıdaki geçici çözümlerden iki senaryonun göre gruplandırılmıştır:
  • Bir geçiş iki DLL üzerinden yönetilen koda yönetilmeyen kod
  • Aynı dll'de yönetilen koda yönetilmeyen kod BIR geçiş

Yönetilmeyen kod için kod geçiş iki DLL arasında yönetilen

Bu özel sorunu gidermek için aşağıdaki yöntemlerden birini kullanın.

Geçici Çözüm 1

ASP.NET istemcileri için ASP.NET ana bilgisayar işlemi DomainUnload olay yakalayarak kapatmaya izin verir. Ancak, öncelikle DomainUnload olay bir temsilci kaydetmeniz gerekir. Bunu yapmak için şu adımları izleyin:
  1. ASP.NET Uygulama</a0> sınıfının <a1>Application_Start</a1> yönteminde, uygulama kaldırır, adlı bir temsilci kaydı.
  2. Aspnet_wp.exe kayıtlı temsilci, kapatma işlemi.
Not Bu geçici çözümü tüm ASP.NET uygulamaları bilgisayarı yeniden başlatmaya neden olur; bu uygulamaları için işlem içindeki oturum durumu verileri kaybolur. Internet ınformation Service (IIS) 6.0 Windows Server 2003 çalıştıran bir bilgisayarda, program her işlem modunda bir uygulama için yapılandırabilirsiniz. Configuing uygulama havuzları hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/2a231dcb-d786-4b6d-b3ba-bda04061a5e7.mspx?mfr=true
//Register a delegate to be called when the DomainUnload event fires.
protected void Application_Start(Object sender, EventArgs e)
{
     AppDomain.CurrentDomain.DomainUnload+= new EventHandler(ADUnloading);
}

//This method is called when the AppDomain is about to unload.
public void ADUnloading(object s, EventArgs e)
{
     System.Environment.Exit(0);
}
				

Geçici çözüm 2

Yönetilen koda yönetilmeyen kod gelen tüm geçişler çağrıları (AppDomain belirli olan) bir temsilci kullanarak oluşturduğunuz bir yönetilmeyen işlev işaretçisi ile değiştirin. Temsilci IJW yerine Platform çağırma Hizmetleri (P/ınvoke) kullanarak Yönetilmeyen koda sıralanmış.

Bu makalenin "Daha fazla bilgi" bölümünde açıklanan yönetilmeyen DLL için aşağıdaki örnek kodu P/ınvoke geri arama yöntemi kullanmak üzere kullanımı gösterilmiştir:
using namespace System::Runtime::InteropServices; // For DllImportAttribute.

namespace ManagedLib
{
        //Managed delegate declaration.
	public __delegate int ManagedFuncDelg();
	public __gc class Class1
	{
		
	public:
		[DllImport("Win32.dll", EntryPoint="callback")]//Assumes that you have a DEF file for the exports.
		static int Mgdcallback(ManagedFuncDelg*);
                //This method is called from the unmanaged DLL.
		static int InternalMethod()
		{
			return 123;
		}

		static ManagedFuncDelg* pd = new ManagedFuncDelg(0, &ManagedLib::Class1::InternalMethod);

                //This method is called by the client application.
		int Func()
		{
			int ret = ManagedLib::Class1::Mgdcallback(ManagedLib::Class1::pd);
			return ret;
		}
	};
}
				

Aynı dll'de kod geçiş yönetilmeyen kod için yönetilen

Bu senaryoda, yöntemleri, (# pragma yönetilmeyen ile işaretli) yönetilmeyen bu makalenin "Daha fazla bilgi" bölümünde gösterilen bir yönetilen bileşende aynı dll'de yöntemleri çağırmadan. Bu özel sorunu gidermek için aşağıdaki yöntemlerden birini kullanın:

Geçici Çözüm 1

Işlev işaretçisini bir temsilci olarak sıralama ve bu temsilciyi kullanın. Aynı DLL üzerinde P/ınvoke kullanamazsınız, çünkü bir sarmalayıcı bir işlev işaretçisini bir temsilciye sıralamakta yardımcı DLL DOSYASı oluşturun. Verilen bu işlev, kendisine geçirilen temsilci adresini döndürür. Aşağıdaki örnek kod, bu geçici çözümü bir örnektir:
//This is the helper DLL that enables you to marshal the delegate.
//Helper.cpp.
//Helper DLL code.
extern "C" __declspec(dllexport) void* __stdcall FuncInUmDll(void* pv)
{
	return pv;
}
				
C++ için yönetilen uzantılar için aşağıdaki örnek kodu olan önceki Helper.dll kullanan bir derleme:
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices; // for DllImportAttribute

namespace ManagedLib
{
      //Forward declaration.
      __delegate int delg();
      int nativefunc(int(__stdcall*)());
      [System::Runtime::InteropServices::DllImport("helper.dll", EntryPoint="FuncInUmDll")] int FuncInUmDll(delg*);
      //Managed component.
      public __gc class Class1{
	public:
            static int InternalMethod()
            {
                 return 123;
            }

            //This method is called by the client application.
            int Func()
            {
                 delg* d= new delg(0, &Class1::InternalMethod);
                 int ret = nativefunc((int(__stdcall*)())FuncInUmDll(d));
                 return ret;
            }
      };


      #pragma unmanaged
     //Unmanaged function calling the managed delegate.
     int nativefunc(int(__stdcall*pf)())
     {
            return pf();
     }
}
				

Geçici çözüm 2

Iki DLL içinde MEC ++ derleme, bölme, bileşenleri yalnızca içeren bir yönetilen ve diğer, yalnızca yönetilmeyen bileşenleri içerir ve P/ınvoke Senaryo 1, 2 geçici çözümde anlatıldığı biçimde kullanın.

Durum

Microsoft, Microsoft bir hata olduğunu onaylamıştır bu makalenin başında listelenen ürünlerden.

Daha fazla bilgi

Sorun, ana bilgisayar ya da istemci uygulamasını kaldırmak ve uygulama etki alanları'nı yeniden yükleyin ve uygulama MEC ++ ve IJW bileşenleri kullanan geçişleri yönetilmeyen kod tarafından yönetilen kod içeriyorsa daha yaygın olarak karşılaşılan bazı kaynaklanmaktadır. ASP.NET iyi bir ana örneğidir. ASP.NET'te, bir şey belirli dosyaları (örneğin, Machine.config) temas için bellek kullanım eşik geçmesini AppDomain unload olayı tetikleyen olaylar olabilir.

Davranışı yeniden oluşturma adımları

Bu örnekte, MEC ++ bileşenini çağıran bir ASP.NET uygulaması varsa, ve bu bileşen MEC ++ bileşenindeki yöntemlerden işaret eden bir işlev işaretçisi var. Bileşeni, işlev işaretçisi aşağıdakilerden birini geçirir:
  • bir işlev bir yönetilmeyen DLL tarafından verildi
  • aynı dll'de yönetilmeyen bir yöntemi
Yönetilmeyen kod sonra MEC ++ bileşeninden alınan işlev işaretçisi kullanarak bir geri arama yapar.

Aşağıdaki senaryolarda, işlev işaretçisi yönetilmeyen işlevini çağırır önce özgün AppDomain içinde DLL yüklendi kaldırılır, olanaklıdır. Bu gibi koşullarda yönetilmeyen kod hala özgün uygulama başvurur ve bu bağlamda yönetilen koda çağrı açılmaya çalışılır.
  • Yönetilmeyen kod için yönetilen kod geçiş arasında iki DLL

    Verilen yönetilmeyen bir DLL işlevi bir MEC ++ çağrı aşağıdaki yollardan biriyle bir derlemede:
    • IJW kullanarak
    • P/ınvoke kullanarak
    Aşağıdaki örnek kodu bir yöntem verir yönetilmeyen bir DLL (Win32.dll) kullanır.
    //Win32.h.
    #ifdef WIN32_EXPORTS
    #define WIN32_API __declspec(dllexport)
    #else
    #define WIN32_API __declspec(dllimport)
    #endif
    
    //Declaration.
    typedef int (__stdcall *funcptr)(void);
    WIN32_API int __stdcall  callback(funcptr ptr);
    
    //Win32.cpp Implementation.
    //This method is called by the Managed C++ component either by using P/Invoke
    //or by using IJW.
    WIN32_API int __stdcall callback(funcptr ptr)
    {
    	int rtn= ptr();
    	return rtn;
    }
    					
    yönetilen BIR C++ derlemesi için Win32.lib bağlantı kurarak ve uygun üstbilgi dosyasına ekleyerek bu yöntemle IJW çağırabilirsiniz. Aşağıdaki örnek kod, verilen yönteminin nasıl kullanılacağını gösterir. # include sonra "win32.h" <a1>Ad</a1> sistem kullanılarak <mscorlib.dll> # kullanarak
    #pragma once
    #include "win32.h"
    #using <mscorlib.dll>
    using namespace System;
    
    namespace ManagedLib
    {
    
    	public __gc class Class1
    	{
    		
    	public:
    		static int InternalMethod()
    		{
    			return 123;
    		}
    
                    //This method is called by the client application.
    		int Func()
    		{
    			int ret = callback((funcptr)Class1::InternalMethod);
    			return ret;
    		}
    	};
    }
    					
  • Yönetilmeyen kod için yönetilen kod geçiş aynı dll'de

    Bu senaryoda, aşağıdaki örnek kodda gösterildiği gibi MEC ++ derleme üzerinde aynı dll'de bir MEC ++ bileşen yöntemlerini çağıran (# pragma yönetilmeyen ile işaretli) yönetilmeyen yöntem içerir.
    #using <mscorlib.dll>
    using namespace System;
    namespace ManagedLib
    {
          //Forward declararion
          int nativefunc(int(__stdcall*)());
          //Managed component
          public __gc class Class1{
    
    	public:
    
                static int InternalMethod()
                {
                     return 123;
                }
                //This method is called by the client application.
                int Func()
                {
                     int ret = nativefunc((int(__stdcall*)())Class1::InternalMethod);
                     return ret;
                }
          };
    
          #pragma unmanaged
         //Unmanaged function calling the managed delegate.
         int nativefunc(int(__stdcall*pf)())
         {
                return pf();
         }
    }
    					

Referanslar

Daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitelerini ziyaret edin:
Uygulama etki alanları
http://msdn2.microsoft.com/en-us/library/cxk374d9(vs.71).aspx?frame=true

AppDomain sınıfı
http://msdn2.microsoft.com/en-us/library/system.appdomain(vs.71).aspx

AppDomainUnloadedException sınıfı
http://msdn.microsoft.com/en-us/library/system.appdomainunloadedexception(VS.71).aspx

C++ programı için Yönetilen Uzantılar
http://msdn2.microsoft.com/en-us/library/aa712574(vs.71).aspx

ASP.NET Web uygulamaları oluşturma
http://msdn.microsoft.com/en-us/library/aa719794.aspx

Alt işlem yalıtım modu
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/34604f82-9175-4d48-b5ea-1e11f19db5f3.mspx?mfr=true

Özellikler

Makale numarası: 309694 - Last Review: 17 Mayıs 2007 Perşembe - Gözden geçirme: 4.7
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.0
Anahtar Kelimeler: 
kbmt kbbug kbijw kbmanaged kbpending KB309694 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:309694

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com