I am writing a MsBuild Task and as part of that I need to resolve types that
exist in silverlight assemblies.
I was having a trouble becasue DefaultAssemblyResolver is not aware of where
the silverlight assemblies are installed
%PROGRAMFILES(x86)%\Reference
Assemblies\Microsoft\Framework\Silverlight\v4.0\

So I had to hack up the bellow code

Not that I use the project file to determine what version of Silverlight the
project is compiled against


So I have a few questions
-Given an assembly is it possible to determine if it is a Silverlight
assembly?
-Given an assembly is it possible to determine what version of Silverlight
it is compiled against?
-Should this functionality exist in DefaultAssemblyResolver?
-If I find a solution that does not require the project file should I submit
a patch?

  public class CustomAssemblyResolver : DefaultAssemblyResolver
   {
       public Weaver Weaver { get; set; }
       string silverlight4Path;
       string silverlight3Path;
       public IBuildEngine2 BuildEngine2 { get; set; }


       public CustomAssemblyResolver()
       {
           silverlight4Path =
Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES(x86)%\Reference
Assemblies\Microsoft\Framework\Silverlight\v4.0\");
           silverlight3Path =
Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES(x86)%\Reference
Assemblies\Microsoft\Framework\Silverlight\v3.0\");
           ResolveFailure += CustomAssemblyResolver_ResolveFailure;
       }

       AssemblyDefinition CustomAssemblyResolver_ResolveFailure(object
sender, AssemblyNameReference reference)
       {
           var targetFrameworkIdentifier = GetTargetFrameworkIdentifier();
           //    "System, Version=2.0.5.0, Culture=neutral,
PublicKeyToken=7cec85d7bea7798e"
           if (targetFrameworkIdentifier == "Silverlight")
           {
               var frameworkVersion = GetFrameworkVersion();
               if (frameworkVersion == "v4.0")
               {
                   var fileName = Path.Combine(silverlight4Path,
reference.Name + ".dll");
                   if (File.Exists(fileName))
                   {
                       var customAssemblyResolverResolveFailure =
AssemblyDefinition.ReadAssembly(fileName);
                       return customAssemblyResolverResolveFailure;
                   }
               }
               if (frameworkVersion == "v3.0")
               {
                   var fileName = Path.Combine(silverlight3Path,
reference.Name + ".dll");
                   if (File.Exists(fileName))
                   {
                       var customAssemblyResolverResolveFailure =
AssemblyDefinition.ReadAssembly(fileName);
                       return customAssemblyResolverResolveFailure;
                   }
               }
           }
           return null;
       }

       private CaseInsensitiveString GetFrameworkVersion()
       {

           var xDocument =
XDocument.Load(BuildEngine2.ProjectFileOfTaskNode);
           return (
                      from c in xDocument.Descendants("{
http://schemas.microsoft.com/developer/msbuild/2003}TargetFrameworkVersion";)
                      select c.Value)
               .FirstOrDefault();
       }
       private CaseInsensitiveString GetTargetFrameworkIdentifier()
       {

           var xDocument =
XDocument.Load(BuildEngine2.ProjectFileOfTaskNode);
           return (
                      from c in xDocument.Descendants("{
http://schemas.microsoft.com/developer/msbuild/2003}TargetFrameworkIdentifier
")
                      select c.Value)
               .FirstOrDefault();
       }


       public void Initialise(Config config)
       {
           AddSearchDirectory(config.TargetAssemblyFilePath.DirectoryName);
       }
   }

-- 
--
mono-cecil

Reply via email to