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