L?I: AppDomainUnloaded ngo?i l? khi b?n s? d?ng qu?n l? ph?n m? r?ng c?a các thành ph?n Visual C++

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 309694 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TRI?U CH?NG

V?n đ? này x?y ra khi m?t cu?c g?i đư?c th?c hi?n t? không đư?c qu?n l? m? qu?n l? m?, bao g?m c? tr?c ti?p qu?n unmanaged-đ?-l? cu?c g?i trong đ?a đơn DLL. ví d?, v?n đ? có th? x?y ra khi MEC + +/ IJW đư?c s? d?ng trong ASP.NET các ?ng d?ng. Trong ASP.NET, s? ki?n khác nhau có th? gây ra các ?ng d?ng đư?c n?p l?i vào m?t AppDomain m?i. N?u b?n đang s? d?ng MEC ++ các thành ph?n và IJW ? đây ?ng d?ng, b?n có th? nh?n di?n AppDomainUnloadException thông báo l?i.

NGUYÊN NHÂN

Như m?t ph?n c?a vi?c th?c hi?n IJW, khi m?t DLL qu?n l? r?ng b?n đ? t?o b?ng cách s? d?ng C++ compiler t?i, th?i gian t?o ra thunks cho quá tr?nh chuy?n đ?i t? m? không đư?c qu?n l? đ? qu?n l? m?. Các thunks ch?a m?t tài li?u tham kh?o đ? AppDomain trong đó DLL t?i. Th?i gian không tái t?o các thunks n?u DLL t?i m?t l?n n?a; Ngoài ra, th?i gian không C?p Nh?t tham kh?o khi AppDomain g?c unloads và DLL t?i trong m?t AppDomain.

Khi chương tr?nh th?c hi?n m?t quá tr?nh chuy?n đ?i t? không đư?c qu?n l? m? đ? qu?n l? m?, chương tr?nh s? d?ng AppDomain l?i th?i tài li?u tham kh?o đ? ch?y m? đư?c qu?n l?. Ngay c? khi AppDomain ban đ?u v?n c?n n?p, m? cant truy c?p vào các l?nh v?c t?nh v? các l?nh v?c c? th? đ? AppDomain.

CÁCH GI?I QUY?T KHÁC

Cách gi?i quy?t sau đây đư?c nhóm l?i theo đi?u hai k?ch b?n:
  • M?t quá tr?nh chuy?n đ?i t? không đư?c qu?n l? m? đ? qu?n l? m? qua hai Dll
  • M?t quá tr?nh chuy?n đ?i t? không đư?c qu?n l? m? đ? m? đư?c qu?n l? trong các cùng m?t DLL

Không đư?c qu?n l? m? đ? qu?n l? quá tr?nh chuy?n đ?i m? trên hai DLLs

S? d?ng m?t trong nh?ng phương pháp sau đây đ? gi?i quy?t này c? th? v?n đ?.

Workaround 1

Cho ASP.LƯ?I khách hàng, cho phép ASP.Quá tr?nh máy ch? lưu tr? NET đ? t?t b?i b?y các DomainUnload s? ki?n. Tuy nhiên, b?n ph?i l?n đ?u tiên đăng k? ngư?i đ?i di?n cho các DomainUnload s? ki?n. Để thực hiện việc này, hãy làm theo những bước sau:
  1. Trong các Application_Start phương pháp c?a ASP.NET ?ng d?ng l?p, đăng k? m?t đ?i bi?u đư?c g?i là khi AppDomain unloads.
  2. T?i các đ?i bi?u đ? đăng k?, đóng c?a Aspnet_wp.exe quá tr?nh.
Chú ý Workaround workaround này gây ra t?t c? ASP.Các ?ng d?ng NET trên các máy tính ph?i kh?i đ?ng l?i; d? li?u tr?ng thái phiên làm vi?c trong quá tr?nh cho t?t c? các các ?ng d?ng s? b? m?t. Trong Internet Information Service (IIS) 6.0 trên m?t máy tính đó ch?y Windows 2003 Server, b?n có th? c?u h?nh chương tr?nh cho m?t ?ng d?ng trên m?t ch? đ? quá tr?nh. Đ? bi?t thêm thông tin v? ?ng d?ng configuing h? bơi, ghé thăm Web site sau c?a Microsoft:
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);
}
				

Workaround 2

Thay th? t?t c? các quá tr?nh chuy?n đ?i t? m? không đư?c qu?n l? đ? qu?n l? m? v?i cu?c g?i thông qua m?t con tr? hàm không đư?c qu?n l? mà b?n t?o ra b?ng cách s? d?ng m?t đ?i bi?u (nào là AppDomain c? th?). Các đ?i bi?u đư?c marshaled m? không đư?c qu?n l? b?ng cách s? d?ng n?n t?ng Invocation Services)P/g?i) thay v? c?a IJW.

Cho t?p DLL không đư?c qu?n l? mô t? trong các "Thông tin" ph?n c?a bài vi?t này, m?u m? sau ch?ng t? làm th? nào đ? s? d?ng P/g?i s? d?ng phương pháp g?i l?i:
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;
		}
	};
}
				

Không đư?c qu?n l? m? đ? qu?n l? quá tr?nh chuy?n đ?i m? trong cùng m?t DLL

Trong trư?ng h?p này, b?n có th? có các phương pháp không đư?c qu?n l? (đư?c đánh d?u b?ng #pragma unmanaged) kêu g?i các phương pháp m?t thành ph?n đư?c qu?n l? trong cùng m?t DLL, như đư?c hi?n th? trong ph?n "Thông tin thêm" c?a bài vi?t này. S? d?ng m?t trong nh?ng đi?u sau đây phương pháp đ? gi?i quy?t v?n đ? này c? th?:

Workaround 1

Nguyên soái c?a b?n con tr? hàm như là m?t đ?i bi?u và s? d?ng đ?i bi?u. B?i v? b?n không th? s? d?ng P/g?i trên cùng m?t DLL, t?o ra m?t wrapper DLL giúp b?n đ? marshal m?t đ?i bi?u đ? m?t con tr? hàm. Ch?c năng này đư?c xu?t chuy?n tr? v? đ?a ch? c?a các đ?i bi?u đư?c thông qua v?i nó. M?u m? sau đây là m?t ví d? v? Workaround workaround này:
//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;
}
				
M?u m? sau đây là các qu?n l? Ti?n ích m? r?ng cho C++ l?p ráp có s? d?ng Helper.dll trư?c đó:
#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();
     }
}
				

Workaround 2

Phân chia c?a b?n MEC ++ l?p ráp vào hai DLLs, m?t trong đó có ch? qu?n l? các thành ph?n và khác có ch?a ch? không đư?c qu?n l? các thành ph?n, và sau đó s? d?ng P/g?i như mô t? trong workaround 2 c?a k?ch b?n 1.

T?NH TR?NG

Microsoft đ? xác nh?n r?ng đây là m?t l?i trong Microsoft s?n ph?m đư?c li?t kê ? đ?u bài vi?t này.

THÔNG TIN THÊM

V?n đ? là ph? bi?n hơn n?u máy ch? ho?c khách hàng ?ng d?ng ph?i l?y và t?i l?i AppDomains và các ?ng d?ng có quá tr?nh chuy?n đ?i t? m? không đư?c qu?n l? đ? qu?n l? m? có s? d?ng MEC C++ và IJW các thành ph?n. ASP.NET là m?t ví d? t?t v? máy như v?y. Trong ASP.NET, các s? ki?n mà có th? kích ho?t m?t AppDomain d? b? s? ki?n có th? là b?t c? đi?u g? t? đi qua m?t b? nh? cách s? d?ng ngư?ng đ? ch?m vào các t?p tin nh?t đ?nh (ví d?, Machine.config).

Các bư?c đ? t?o l?i hành vi

Trong ví d? này, b?n có m?t ASP.NET ?ng d?ng mà các cu?c g?i m?t MEC C++, và thành ph?n c?u ph?n này có m?t con tr? hàm tr? đ?n m?t trong nh?ng phương pháp trong thành ph?n MEC C++. Các thành ph?n vư?t qua các ch?c năng con tr? ch? t?i m?t trong các cách sau:
  • m?t hàm đư?c xu?t kh?u b?i m?t DLL không đư?c qu?n l?
  • m?t phương pháp không đư?c qu?n l? trong cùng m?t DLL
Không đư?c qu?n l? m? sau đó làm cho m?t g?i l?i b?ng cách s? d?ng ch?c năng con tr? nh?n đư?c t? thành ph?n MEC C++.

Trong sau đây k?ch b?n, có th? đó, trư?c khi các ch?c năng không đư?c qu?n l? invokes các con tr? hàm, AppDomain ban đ?u trong đó đ? đư?c n?p DLL là b?c d?. Các đi?u ki?n như v?y, không đư?c qu?n l? m? v?n c?n tham chi?u các b?n g?c AppDomain và c? g?ng đ? g?i cho qu?n l? m? trong b?i c?nh đó.
  • Không đư?c qu?n l? m? đ? qu?n l? quá tr?nh chuy?n đ?i m? trên hai DLLs

    G?i m?t ch?c năng DLL đ? xu?t chuy?n không đư?c qu?n l? t? m?t MEC C++ l?p ráp t?i m?t trong nh?ng cách sau đây:
    • b?ng cách s? d?ng IJW
    • b?ng cách s? d?ng P/g?i
    M?u m? sau đây s? d?ng m?t DLL không đư?c qu?n l? (Win32.dll) mà xu?t kh?u m?t phương pháp.
    //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;
    }
    					
    L?p ráp C++ đư?c qu?n l? có th? g?i cho phương pháp này thông qua IJW b?ng cách liên k?t đ?n Win32.lib và b?ng cách bao g?m các t?p tin tiêu đ? thích h?p. Sau đây m? m?u cho th?y làm th? nào đ? s? d?ng phương pháp xu?t kh?u.
    #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;
    		}
    	};
    }
    					
  • Không đư?c qu?n l? m? đ? qu?n l? quá tr?nh chuy?n đ?i m? trong cùng m?t DLL

    Trong trư?ng h?p này, l?p ráp MEC ++ ch?a không đư?c qu?n l? (đư?c đánh d?u b?ng các phương pháp #pragma unmanaged) mà g?i phương pháp trên m?t MEC ++ thành ph?n trong cùng m?t DLL, như đư?c hi?n th? trong m?u m? sau đây.
    #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();
         }
    }
    					

THAM KH?O

Đ? bi?t thêm chi ti?t, h?y truy c?p Microsoft sau đây Các trang Web c?a nhà phát tri?n m?ng (MSDN):
L?nh v?c ?ng d?ng
http://msdn2.Microsoft.com/en-US/Library/cxk374d9 (vs.71) .aspx? khung = true

AppDomain l?p
http://msdn2.Microsoft.com/en-US/Library/System.appdomain (vs.71) .aspx

AppDomainUnloadedException l?p
http://MSDN.Microsoft.com/en-US/Library/System.appdomainunloadedexception (VS.71) .aspx

Ph?n m? r?ng đư?c qu?n l? đ? l?p tr?nh C++
http://msdn2.Microsoft.com/en-US/Library/aa712574 (vs.71) .aspx

T?o ASP.NET Web Applications
http://MSDN.Microsoft.com/en-US/Library/aa719794.aspx

Công nhân quá tr?nh cô l?p ch? đ?
http://www.Microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/34604f82-9175-4d48-b5ea-1e11f19db5f3.mspx?MFR=True

Thu?c tính

ID c?a bài: 309694 - L?n xem xét sau cùng: 27 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.0
T? khóa: 
kbbug kbijw kbmanaged kbpending kbmt KB309694 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:309694

Cung cấp Phản hồi

 

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