Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / CompMod / System / ComponentModel / Design / DesigntimeLicenseContext.cs / 2 / DesigntimeLicenseContext.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.ComponentModel.Design { using System.Runtime.Remoting; using System.Diagnostics; using System; using Microsoft.Win32; using System.Net; using System.IO; using System.Reflection; using System.Reflection.Emit; using System.Collections; using System.ComponentModel; using System.Globalization; using System.Security; using System.Security.Permissions; ////// [HostProtection(SharedState = true)] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name = "FullTrust")] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")] public class DesigntimeLicenseContext : LicenseContext { internal Hashtable savedLicenseKeys = new Hashtable(); ////// Provides design-time support for licensing. /// ////// public override LicenseUsageMode UsageMode { get { return LicenseUsageMode.Designtime; } } ////// Gets or sets the license usage mode. /// ////// public override string GetSavedLicenseKey(Type type, Assembly resourceAssembly) { return null; } ////// Gets a saved license key. /// ////// public override void SetSavedLicenseKey(Type type, string key) { savedLicenseKeys[type.AssemblyQualifiedName] = key; } } [HostProtection(SharedState = true)] internal class RuntimeLicenseContext : LicenseContext { private static TraceSwitch RuntimeLicenseContextSwitch = new TraceSwitch("RuntimeLicenseContextTrace", "RuntimeLicenseContext tracing"); const int ReadBlock = 400; internal Hashtable savedLicenseKeys; ////// Sets a saved license key. /// ////// This method takes a file URL and converts it to a local path. The trick here is that /// if there is a '#' in the path, everything after this is treated as a fragment. So /// we need to append the fragment to the end of the path. /// private string GetLocalPath(string fileName) { System.Diagnostics.Debug.Assert(fileName != null && fileName.Length > 0, "Cannot get local path, fileName is not valid"); Uri uri = new Uri(fileName); return uri.LocalPath + uri.Fragment; } public override string GetSavedLicenseKey(Type type, Assembly resourceAssembly) { if (savedLicenseKeys == null || savedLicenseKeys[type.AssemblyQualifiedName]==null) { Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose, "savedLicenseKey is null or doesnt contain our type"); if (savedLicenseKeys == null) { savedLicenseKeys = new Hashtable(); } Uri licenseFile = null; if (resourceAssembly == null) { Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"resourceAssembly is null"); string rawFile = (string)AppDomain.CurrentDomain.SetupInformation.LicenseFile; Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"rawfile: " + rawFile); string codeBase; // FileIOPermission is required for ApplicationBase in URL-hosted domains FileIOPermission perm = new FileIOPermission(PermissionState.Unrestricted); perm.Assert(); try { codeBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; } finally { CodeAccessPermission.RevertAssert(); } if (rawFile != null && codeBase != null) { licenseFile = new Uri(new Uri(codeBase), rawFile); } } if (licenseFile == null) { if(resourceAssembly == null) { resourceAssembly = Assembly.GetEntryAssembly(); } if (resourceAssembly == null) { Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"resourceAssembly is null"); // If Assembly.EntryAssembly returns null, then we will // try everything! // foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { // Though, I could not repro this, we seem to be hitting an AssemblyBuilder // when walking through all the assemblies in the current app domain. This throws an // exception on Assembly.CodeBase and we bail out. Catching exceptions here is not a // bad thing. if (asm is AssemblyBuilder) continue; // file://fullpath/foo.exe // string fileName; FileIOPermission perm = new FileIOPermission(PermissionState.Unrestricted); perm.Assert(); try { fileName = GetLocalPath(asm.EscapedCodeBase); fileName = new FileInfo(fileName).Name; } finally { CodeAccessPermission.RevertAssert(); } Stream s = asm.GetManifestResourceStream(fileName + ".licenses"); if (s == null) { //Since the casing may be different depending on how the assembly was loaded, //we'll do a case insensitive lookup for this manifest resource stream... s = CaseInsensitiveManifestResourceStreamLookup(asm, fileName + ".licenses"); } if (s != null) { DesigntimeLicenseContextSerializer.Deserialize(s, fileName.ToUpper(CultureInfo.InvariantCulture), this); break; } } } else if(!(resourceAssembly is AssemblyBuilder)) { // EscapedCodeBase won't be supported by emitted assemblies anyway Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"resourceAssembly is not null"); string fileName; FileIOPermission perm = new FileIOPermission(PermissionState.Unrestricted); perm.Assert(); try { fileName = GetLocalPath(resourceAssembly.EscapedCodeBase); } finally { CodeAccessPermission.RevertAssert(); } fileName = Path.GetFileName(fileName); // we don't want to use FileInfo here... it requests FileIOPermission that we // might now have... see VSWhidbey 527758 string licResourceName = fileName + ".licenses"; // first try the filename Stream s = resourceAssembly.GetManifestResourceStream(licResourceName); if (s == null) { string resolvedName = null; CompareInfo comparer = CultureInfo.InvariantCulture.CompareInfo; string shortAssemblyName = resourceAssembly.GetName().Name; // if the assembly has been renamed, we try our best to find a good match in the available resources // by looking at the assembly name (which doesn't change even after a file rename) + ".exe.licenses" or + ".dll.licenses" foreach(String existingName in resourceAssembly.GetManifestResourceNames()) { if (comparer.Compare(existingName, licResourceName, CompareOptions.IgnoreCase) == 0 || comparer.Compare(existingName, shortAssemblyName + ".exe.licenses", CompareOptions.IgnoreCase) == 0 || comparer.Compare(existingName, shortAssemblyName + ".dll.licenses", CompareOptions.IgnoreCase) == 0) { resolvedName = existingName; break; } } if (resolvedName != null) { s = resourceAssembly.GetManifestResourceStream(resolvedName); } } if (s != null) { DesigntimeLicenseContextSerializer.Deserialize(s, fileName.ToUpper(CultureInfo.InvariantCulture), this); } } } if (licenseFile != null) { Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"licenseFile: " + licenseFile.ToString()); Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"opening licenses file over URI " + licenseFile.ToString()); Stream s = OpenRead(licenseFile); if (s != null) { string[] segments = licenseFile.Segments; string licFileName = segments[segments.Length - 1]; string key = licFileName.Substring(0, licFileName.LastIndexOf(".")); DesigntimeLicenseContextSerializer.Deserialize(s, key.ToUpper(CultureInfo.InvariantCulture), this); } } } Debug.WriteLineIf(RuntimeLicenseContextSwitch.TraceVerbose,"returning : " + (string)savedLicenseKeys[type.AssemblyQualifiedName]); return(string)savedLicenseKeys[type.AssemblyQualifiedName]; } /** * Looks up a .licenses file in the assembly manifest using * case-insensitive lookup rules. We do this because the name * we are attempting to locate could have different casing * depending on how the assembly was loaded. **/ private Stream CaseInsensitiveManifestResourceStreamLookup(Assembly satellite, string name) { CompareInfo comparer = CultureInfo.InvariantCulture.CompareInfo; //loop through the resource names in the assembly // we try to handle the case where the assembly file name has been renamed // by trying to guess the original file name based on the assembly name... string assemblyShortName = satellite.GetName().Name; foreach(string existingName in satellite.GetManifestResourceNames()) { if (comparer.Compare(existingName, name, CompareOptions.IgnoreCase) == 0 || comparer.Compare(existingName, assemblyShortName + ".exe.licenses") == 0 || comparer.Compare(existingName, assemblyShortName + ".dll.licenses") == 0) { name = existingName; break; } } //finally, attempt to return our stream based on the //case insensitive match we found // return satellite.GetManifestResourceStream(name); } static Stream OpenRead(Uri resourceUri) { Stream result = null; PermissionSet perms = new PermissionSet(PermissionState.Unrestricted); perms.Assert(); try { WebClient webClient = new WebClient(); webClient.Credentials = CredentialCache.DefaultCredentials; result = webClient.OpenRead(resourceUri.ToString()); } catch (Exception e) { Debug.Fail(e.ToString()); } finally { CodeAccessPermission.RevertAssert(); } return result; } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ContextConfiguration.cs
- StrokeNodeOperations2.cs
- SqlUtils.cs
- DesignerDataSourceView.cs
- TemplateXamlTreeBuilder.cs
- NativeMethods.cs
- DataGridTablesFactory.cs
- WindowsHyperlink.cs
- ComponentResourceManager.cs
- AssertFilter.cs
- ConsoleCancelEventArgs.cs
- IISMapPath.cs
- SqlBooleanizer.cs
- ToolStripContainer.cs
- MemberDomainMap.cs
- RepeaterCommandEventArgs.cs
- DuplicateWaitObjectException.cs
- LogicalExpr.cs
- ASCIIEncoding.cs
- XmlDataCollection.cs
- WindowsStartMenu.cs
- CellTreeNodeVisitors.cs
- HtmlLink.cs
- PlacementWorkspace.cs
- RemoteWebConfigurationHostStream.cs
- GlyphInfoList.cs
- DiscoveryReferences.cs
- PropertyDescriptorGridEntry.cs
- HashHelper.cs
- StickyNoteHelper.cs
- __TransparentProxy.cs
- ClientScriptManager.cs
- InkCollectionBehavior.cs
- listitem.cs
- UnsafeNativeMethods.cs
- DLinqAssociationProvider.cs
- UnmanagedBitmapWrapper.cs
- OleServicesContext.cs
- StrokeNodeOperations.cs
- DataAccessor.cs
- XamlPoint3DCollectionSerializer.cs
- UriParserTemplates.cs
- CommonDialog.cs
- ServiceDescriptions.cs
- GroupDescription.cs
- TabControlDesigner.cs
- FormatterServices.cs
- DataBoundControlHelper.cs
- DeflateEmulationStream.cs
- BitmapScalingModeValidation.cs
- Semaphore.cs
- Fx.cs
- ExclusiveHandle.cs
- LocalizableResourceBuilder.cs
- RequestSecurityTokenForRemoteTokenFactory.cs
- ConstantSlot.cs
- DataGridViewColumnCollection.cs
- Brush.cs
- DataGridBoolColumn.cs
- SafeEventLogWriteHandle.cs
- MD5.cs
- HttpMethodConstraint.cs
- EventRecordWrittenEventArgs.cs
- Thumb.cs
- NetworkInformationPermission.cs
- CalendarDayButton.cs
- Identifier.cs
- DependencyPropertyConverter.cs
- ToolStripDropDown.cs
- DataGridCellItemAutomationPeer.cs
- ExpressionNormalizer.cs
- HttpStaticObjectsCollectionWrapper.cs
- NativeRightsManagementAPIsStructures.cs
- XmlSchemaSubstitutionGroup.cs
- SqlTypeConverter.cs
- OdbcPermission.cs
- TableCellsCollectionEditor.cs
- SystemWebCachingSectionGroup.cs
- TriggerAction.cs
- DXD.cs
- PlainXmlDeserializer.cs
- DesignerObject.cs
- CompilationSection.cs
- ObjectStateManager.cs
- AnnotationHelper.cs
- AssemblyAttributesGoHere.cs
- BitmapEffectGroup.cs
- SqlExpander.cs
- ProcessHostFactoryHelper.cs
- ExeConfigurationFileMap.cs
- SqlDataSourceQueryEditor.cs
- DetailsView.cs
- BinaryCommonClasses.cs
- SudsWriter.cs
- MissingFieldException.cs
- StateInitializationDesigner.cs
- ExpandCollapseProviderWrapper.cs
- DelegateTypeInfo.cs
- DataAccessException.cs
- PrintPreviewDialog.cs