(12)의 NOP 소스 분석

A와 연결

///  <요약> 
        /// 파일을 수행 deply
         ///  </ 요약> 
        ///  <PARAM NAME = "플러그"> 플러그인 파일 정보 </ PARAM> 
        ///  <리턴> 조립 </ 반품> 
        개인  정적 조립 PerformFileDeploy (이 FileInfo 플러그) 
        { 
            경우 (plug.Directory.Parent == null이 )
                 던져  새로운 InvalidOperationException이을 ( " 의 플러그인 디렉토리 " + plug.Name +
                                                     "파일이 허용 nopCommerce 폴더 계층 구조의 폴더 외부에 존재하는 " ) 

            에서는 FileInfo shadowCopiedPlug, 

            경우에 ! (CommonHelper.GetTrustLevel은 () = AspNetHostingPermissionLevel.Unrestricted가) 
            { 
                // 모든 플러그인에 복사해야합니다 ~ / 플러그인 / 빈 /
                 // 이 모든 probingPaths가의 Web.config에 정적으로 설정되는에 의존하기 때문에이이 aboslutely 필요합니다 
                
                //이 의대 신뢰에서 실행되었다, 그래서 사용자 정의 빈 폴더에 복사 
                VAR shadowCopyPlugFolder = Directory.CreateDirectory (_shadowCopyFolder.FullName) 
                shadowCopiedPlug =InitializeMediumTrust (플러그 shadowCopyPlugFolder); 
            } 
            다른 
            { 
                var에 디렉토리 = AppDomain.CurrentDomain.DynamicDirectory; 
                의 Debug.WriteLine (plug.FullName + " " + 디렉토리);
                // 그래서 폴더 표준 동적 복사 완전 신뢰로 실행 된 
                shadowCopiedPlug = InitializeFullTrust (플러그, 의 DirectoryInfo (디렉토리)); 
            } 

            // 우리는 이제 플러그인 정의 등록 할 수 있습니다 
            VAR shadowCopiedAssembly =을Assembly.Load (AssemblyName.GetAssemblyName (shadowCopiedPlug.FullName)); 

            // 빌드 관리자에 대한 참조 추가 
            의 Debug.WriteLine ( " BuildManager에 추가를 : '{0}' ' , shadowCopiedAssembly.FullName을); 
            BuildManager.AddReferencedAssembly (shadowCopiedAssembly); 

            반환 shadowCopiedAssembly을; 
        }

보기 CommonHelper.GetTrustLevel 방법 :

///  <요약> 
        ///는 실행중인 응용 프로그램의 신뢰 수준 (찾습니다 http://blogs.msdn.com/dmitryr/archive/2007/01/23/finding-out-the-current-trust-level-를 에서-ASP-net.aspx )
         ///  </ 요약> 
        ///  <리턴> 현재 신뢰 수준. </ 반환> 
        공용  정적 AspNetHostingPermissionLevel GetTrustLevel () 
        { 
            경우 (! _trustLevel.HasValue) 
            { 
                // 설정된 최소 
                _trustLevel = AspNetHostingPermissionLevel.None; 

                // 최대 결정 
                foreach 문을 (AspNetHostingPermissionLevel하자면 trustlevel 새로운 [{ 
                                AspNetHostingPermissionLevel.Unrestricted가 
                                AspNetHostingPermissionLevel.High가 
                                AspNetHostingPermissionLevel.Medium가 
                                AspNetHostingPermissionLevel.Low가 
                                AspNetHostingPermissionLevel.Minimal이 
                            }) 
                { 
                    시도 
                    { 
                        새로운 AspNetHostingPermission (하자면 trustlevel) .Demand (); 
                        _trustLevel = 하자면 trustlevel;
                        휴식 ; //우리는 우리가 할 수있는 가장 높은 권한을 설정했습니다 
                    }
                     캐치 (System.Security.SecurityException) 
                    { 
                        계속을 ; 
                    } 
                } 
            } 
            반환 _trustLevel.Value을; 
        }

일반적인 의미는 다음과 같습니다 가치가없는 새로운 레벨이 먼저 허락 성공적인 복귀를 부여하는 경우 오류가 부여 될 수있는 전류에 부여 된 권한에 따라 부여 계속되면, 최대 기관에서 시작, 모든 후, 권한, 트래버스 권한을 부여하지에 설정 한 경우 권한.

그렇지 않을 경우 가장 큰 특권, BIN 디렉토리를 생성하고 메소드를 호출합니다

VAR shadowCopyPlugFolder = Directory.CreateDirectory (_shadowCopyFolder.FullName); 
                shadowCopiedPlug = InitializeMediumTrust (플러그 shadowCopyPlugFolder);

InitializeMediumTrust은 다음과 같습니다 :

// <요약> 
        /// 중간 신뢰에서 실행할 때 플러그인을 초기화하는 데 사용
         ///  </ 요약> 
        ///  <PARAM NAME = "플러그"> </ PARAM> 
        ///  <PARAM NAME = "shadowCopyPlugFolder"> </ PARAM> 
        ///  <리턴> </ 복귀> 
        개인  정적 에서는 FileInfo InitializeMediumTrust (에서는 FileInfo 플러그의 DirectoryInfo shadowCopyPlugFolder) 
        { 
            VAR shouldCopy = ;
            VAR shadowCopiedPlug는 = 새로운 에서는 FileInfo (Path.Combine (shadowCopyPlugFolder.FullName, plug.Name을)); 

            //확인 그림자 복사 된 파일이 이미 존재하고 않는 경우가 업데이트됩니다 경우 수행하지 않을 경우, 체크, 복사 할 경우 
            경우 (shadowCopiedPlug.Exists) 
            { 
                // 이 LastWriteTimeUTC를 사용하는 것이 좋습니다,하지만 모든 파일 시스템이 속성을 가지고
                 // 어쩌면 이 파일의 해시를 비교하는 것이 좋습니다? 
                VAR areFilesIdentical shadowCopiedPlug.CreationTimeUtc.Ticks => = plug.CreationTimeUtc.Ticks;
                경우 (areFilesIdentical) 
                { 
                    의 Debug.WriteLine ( " 복사하지 않고, 파일이 동일하게 표시 : '{0}' ' , shadowCopiedPlug.Name); 
                    shouldCopy =거짓 ; 
                } 
                다른 
                { 
                    // 기존 파일 삭제 

                    // 더 많은 정보를 : http://www.nopcommerce.com/boards/t/11511/access-error-nopplugindiscountrulesbillingcountrydll.aspx?p=4 # 60838 
                    의 Debug.WriteLine ( " 새로운 플러그인 발견, 이전 파일을 삭제 : '{0}' ' , shadowCopiedPlug.Name); 
                    File.delete를 (shadowCopiedPlug.FullName); 
                } 
            } 

            경우 (shouldCopy) 
            { 
                시도 
                { 
                    File.Copy (plug.FullName, shadowCopiedPlug.FullName, 사실); 
                } 
                캐치 (IOException가) 
                { 
                    의 Debug.WriteLine (shadowCopiedPlug.FullName +는 " 이름을 변경하려고 잠겨 있습니다 " );
                    // 파일이 고정되면 이러한 문제가 발생,
                     // 파일을 몇 번 플러그인 어떤 이유로 devenv를 잠금과 다른 미친 이유로 당신은 그 이름을 바꿀 수 있습니다
                     // 그것의 한 번, 우리가 여기에서 무엇을하고 있는지 그래서, 잠금을 해제하는 이름, 우리 다시 섀도 복사 할 수있는 
                    시도 
                    { 
                        var에 oldFile = shadowCopiedPlug.FullName + Guid.NewGuid (). ToString ( "N " ) + " .old로 " ; 
                        File.Move (shadowCopiedPlug.FullName, oldFile); 
                    } 
                    캐치 (IOException이의 EXC) 
                    { 
                        던져  새로운 IOException이 (shadowCopiedPlug.FullName +를 " , 이름 바꾸기 실패 초기화 플러그인 수 없다 " , EXC); 
                    } 
                    // 좋아, 우리는 여기까지, 지금 섀도 복사본 다시 시도했습니다 
                    File.Copy (plug.FullName, shadowCopiedPlug.FullName, 진정한 ;) 
                } 
            } 

            수익을  shadowCopiedPlug을;
        }

새로운에서는 FileInfo의 bin 디렉토리에서 얻어진 입력 값에 따라, 파일이 이미 존재하는 경우, UTC 시간의 비교를 만들 수 있습니다.

이 false로 설정되어 복사 할 새 파일 인 경우 이전 파일이 삭제됩니다.

당신은 그것이 사실 복사해야 할 경우, BIN에 복사. . . 마지막으로, BIN의 파일 이름의 전체 경로로 돌아갑니다.

마지막으로, 파일 이름에 따라 어셈블리에 조립 및 수익을로드합니다.

foreach는 DLL은주기의 나머지로드.

마지막 설정 값 및 유형 pluginType이 referencedPlugins에 추가됩니다. 마지막 과제

ReferencedPlugins = referencedPlugins; 
                IncompatiblePlugins = incompatiblePlugins;

PluginManager를 클래스의 초기화 방법은 ReferencedPlugins을 제공한다.

_plugins 할당 그 안에 EnsurePluginsAreLoaded 방법 (ReferencedPlugins가 .tolist).

GetPluginDescriptors 方法 :

///  <요약> 
        /// 가져 오기 플러그인 설명
         ///  </ 요약> 
        ///  <PARAM NAME = "loadMode"> 로드 플러그인 모드 </ PARAM> 
        ///  <PARAM NAME = "에 storeId"> 로드 기록 단지 지정된 저장소에 허용; 모든 레코드로드 0을 전달 </ PARAM> 
        ///  <PARAM NAME = "그룹"> 기를 플러그인 필터; 모든 레코드를로드 널을 통과 </ PARAM> 
        ///  <복귀> 플러그인 설명 </ 반환> 
        공중  가상 IEnumerable을 <PluginDescriptor> GetPluginDescriptors (LoadPluginsMode loadMode = LoadPluginsMode.InstalledOnly,
            0 , 문자열 군 = ) 
        { 
            // 플러그인되도록 적재된다 
            EnsurePluginsAreLoaded을 (); 

             _plugins.Where (p => CheckLoadMode (p, loadMode) && AuthenticateStore (p,에 storeId) && CheckGroup (p, 기)); 
        }

마지막 문장, 잘 생긴 차기 설치하고, 때 storeID있다. 그룹이 비어 확실히 플러그인의 사실이다.

추천

출처www.cnblogs.com/runit/p/4213766.html