예제 #1
0
        internal void AddAssembly(Int16 assemblyId, string assemblyName)
        {
            if (assemblyId < 0)
            {
                throw new ArgumentOutOfRangeException("assemblyId");
            }

            if (assemblyName == null)
            {
                throw new ArgumentNullException("assemblyName");
            }

            lock (_bamlAssembly)
            {
                if (assemblyId == _bamlAssembly.Count)
                {
                    BamlAssembly assembly = new BamlAssembly(assemblyName);
                    _bamlAssembly.Add(assembly);
                }
                else if (assemblyId > _bamlAssembly.Count)
                {
                    throw new ArgumentOutOfRangeException("assemblyId", SR.Get(SRID.AssemblyIdOutOfSequence, assemblyId));
                }
            }
            // Duplicate IDs (assemblyId < _bamlAssembly.Count) are ignored
        }
예제 #2
0
        private Assembly ResolveAssembly(BamlAssembly bamlAssembly)
        {
            if (bamlAssembly.Assembly != null)
            {
                return(bamlAssembly.Assembly);
            }

            AssemblyName assemblyName = new AssemblyName(bamlAssembly.Name);

            bamlAssembly.Assembly = MS.Internal.WindowsBase.SafeSecurityHelper.GetLoadedAssembly(assemblyName);
            if (bamlAssembly.Assembly == null)
            {
                byte[] publicKeyToken = assemblyName.GetPublicKeyToken();
                if (assemblyName.Version != null || assemblyName.CultureInfo != null || publicKeyToken != null)
                {
                    try
                    {
                        bamlAssembly.Assembly = Assembly.Load(assemblyName.FullName);
                    }
                    catch
                    {
                        // Fall back to short name match.
                        if (bamlAssembly.Assembly == null)
                        {
                            // First try to match the local assembly (which may be in the LoadFrom/LoadFile context)
                            if (MatchesLocalAssembly(assemblyName.Name, publicKeyToken))
                            {
                                bamlAssembly.Assembly = _localAssembly;
                            }
                            // Otherwise try Assembly.Load
                            else
                            {
                                AssemblyName shortName = new AssemblyName(assemblyName.Name);
                                if (publicKeyToken != null)
                                {
                                    shortName.SetPublicKeyToken(publicKeyToken);
                                }
                                bamlAssembly.Assembly = Assembly.Load(shortName);
                            }
                        }
                    }
                }
                else
                {
                    // Only a short name was provided.
                    // Don't need to check for local assembly match, because if it matched the local
                    // assembly, we would have caught it in GetLoadedAssembly up above.
                    bamlAssembly.Assembly = Assembly.LoadWithPartialName(assemblyName.Name);
                }
            }
            return(bamlAssembly.Assembly);
        }
예제 #3
0
        private bool TryGetBamlAssembly(Int16 assemblyId, out BamlAssembly bamlAssembly)
        {
            lock (_syncObject)
            {
                if (assemblyId >= 0 && assemblyId < _bamlAssembly.Count)
                {
                    bamlAssembly = _bamlAssembly[assemblyId];
                    return(true);
                }
            }

            Assembly assembly = KnownTypes.GetKnownAssembly(assemblyId);

            if (assembly != null)
            {
                bamlAssembly = new BamlAssembly(assembly);
                return(true);
            }

            bamlAssembly = null;
            return(false);
        }
예제 #4
0
        private bool TryGetBamlAssembly(Int16 assemblyId, out BamlAssembly bamlAssembly)
        {
            lock (_syncObject)
            {
                if (assemblyId >= 0 && assemblyId < _bamlAssembly.Count)
                {
                    bamlAssembly = _bamlAssembly[assemblyId];
                    return true;
                }
            }

            Assembly assembly = KnownTypes.GetKnownAssembly(assemblyId);
            if (assembly != null)
            {
                bamlAssembly = new BamlAssembly(assembly);
                return true;
            }

            bamlAssembly = null;
            return false;
        }
예제 #5
0
        private Assembly ResolveAssembly(BamlAssembly bamlAssembly)
        {
            if (bamlAssembly.Assembly != null)
            {
                return bamlAssembly.Assembly;
            }

            AssemblyName assemblyName = new AssemblyName(bamlAssembly.Name);
            bamlAssembly.Assembly = MS.Internal.WindowsBase.SafeSecurityHelper.GetLoadedAssembly(assemblyName);
            if (bamlAssembly.Assembly == null)
            {
                byte[] publicKeyToken = assemblyName.GetPublicKeyToken();
                if (assemblyName.Version != null || assemblyName.CultureInfo != null || publicKeyToken != null)
                {
                    try
                    {
                        bamlAssembly.Assembly = Assembly.Load(assemblyName.FullName);
                    }
                    catch
                    {
                        // Fall back to short name match.
                        if (bamlAssembly.Assembly == null)
                        {
                            // First try to match the local assembly (which may be in the LoadFrom/LoadFile context)
                            if (MatchesLocalAssembly(assemblyName.Name, publicKeyToken))
                            {
                                bamlAssembly.Assembly = _localAssembly;
                            }
                            // Otherwise try Assembly.Load
                            else
                            {
                                AssemblyName shortName = new AssemblyName(assemblyName.Name);
                                if (publicKeyToken != null)
                                {
                                    shortName.SetPublicKeyToken(publicKeyToken);
                                }
                                bamlAssembly.Assembly = Assembly.Load(shortName);
                            }
                        }
                    }
                }
                else
                {
                    // Only a short name was provided.
                    // Don't need to check for local assembly match, because if it matched the local
                    // assembly, we would have caught it in GetLoadedAssembly up above.
                    bamlAssembly.Assembly = Assembly.LoadWithPartialName(assemblyName.Name);
                }
            }
            return bamlAssembly.Assembly;
        }
예제 #6
0
        internal void AddAssembly(Int16 assemblyId, string assemblyName)
        {
            if (assemblyId < 0)
            {
                throw new ArgumentOutOfRangeException("assemblyId");
            }

            if (assemblyName == null)
            {
                throw new ArgumentNullException("assemblyName");
            }

            lock (_bamlAssembly)
            {
                if (assemblyId == _bamlAssembly.Count)
                {
                    BamlAssembly assembly = new BamlAssembly(assemblyName);
                    _bamlAssembly.Add(assembly);
                }
                else if (assemblyId > _bamlAssembly.Count)
                {
                    throw new ArgumentOutOfRangeException("assemblyId", SR.Get(SRID.AssemblyIdOutOfSequence, assemblyId));
                }
            }
            // Duplicate IDs (assemblyId < _bamlAssembly.Count) are ignored
        }
예제 #7
0
        public BamlAssembly[] GetReferencedAssemblies(BamlAssembly asm)
        {
            AssemblyName[] list = asm.Assembly.GetReferencedAssemblies();

            return (from an in list
                    select this.LoadAssembly(an)).ToArray();
        }