在MSBuild任务中使用Mono.Cecil解析程序集是Silverlight还是.NET

时间:2012-10-05 10:47:27

标签: c# cil mono.cecil

我正在使用MSBuild任务中的Mono.Cecil,我遇到了解决程序集问题的方法。它正在拿起.NET版本的Prism而不是Silverlight版本。 Prism的.NET版本不包含Microsoft.Practices.Prism.Regions.Behaviors.TabControlRegionSyncBehavior,因此我们无法解析该类型。

我正在中间输出上执行任务,因此引用的程序集不在该文件夹中。程序集的搜索路径在MSBuild脚本中设置为ReferencePath。

Mono.Cecil在此函数中进行基于名称的匹配:

AssemblyDefinition SearchDirectory (AssemblyNameReference name, IEnumerable<string> directories, ReaderParameters parameters)
{
    var extensions = new [] { ".exe", ".dll" };
    foreach (var directory in directories) {
        foreach (var extension in extensions) {
            string file = Path.Combine (directory, name.Name + extension);
            if (File.Exists (file))
                return GetAssembly (file, parameters);
        }
    }
    return null;
}

有没有办法让它来比较运行时(Silverlight vs .NET)?还有其他方法可以解决这个问题吗?让它使用Metadata version

是明智的吗?

1 个答案:

答案 0 :(得分:2)

塞西尔解决.NET程序集的问题比这更复杂。问题是您正在尝试使用的Cecil的DefaultAssemblyResolver不知道如何解析Silverlight程序集。它只知道库存.NET程序集。

有关自定义程序集解析过程的示例,请参阅Stack Overflow问题 Mono.Cecil fails to process a Silverlight 5 assembly