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있다. 그룹이 비어 확실히 플러그인의 사실이다.