【问题标题】:Mono.Cecil Module of BaseType is incorrectBaseType 的 Mono.Cecil 模块不正确
【发布时间】:2011-10-13 12:49:33
【问题描述】:

我正在使用 AssembliyDefinition.ReadAssembly 加载两个程序集

在 AssemblyA 中我定义了 ClassA。

在 AssemblyB 中,我定义 ClassB : ClassA。

当我检查 ClassB 的 TypeDefinition.BaseType 时,我发现它的 Module 是 AssemblyB。

我希望它的模块是 AssemblyA,因为 ClassB 的基本类型是 ClassA,它是在 AssemblyA 中定义的。

这对我来说显示为错误,因为当我尝试执行 classB.BaseType.Resolve() 时出现错误,这可能是因为它在错误的程序集中搜索 ClassA。

有什么想法吗?

谢谢

【问题讨论】:

    标签: c# mono.cecil


    【解决方案1】:

    你的预期不正确。

    Cecil 与 System.Reflection 不同,对于模块,Cecil 区分了此模块中定义的类型:TypeDefinition 和另一个模块中定义的类型:TypeReference。

    这就是 BaseType 是 TypeReference 实例的原因,在您的情况下,对 ClassA 的引用位于 AssemblyB 内部。如果要查看 BaseType 的定义位置,而不是使用位置,则必须使用 TypeReference 的 Scope 属性。

    如果您在 Resolve 中遇到错误,那是一个完全不同的问题。但是你没有显示任何关于这个错误的信息,所以我们不得不猜测程序集解析器不知道在哪里寻找 AssemblyA。根据您的评论,情况就是这样。您可以执行以下操作:

    var resolver = new DefaultAssemblyResolver ();
    resolver.AddSearchDirectory ("path/to/AssemblyA");
    resolver.AddSearchDirectory ("path/to/AssemblyB");
    
    var a = AssemblyDefinition.ReadAssembly (
        "path/to/AssemblyA/AssemblyA.dll",
        new ReaderParameters { AssemblyResolver = resolver });
    
    var b = AssemblyDefinition.ReadAssembly (
        "path/to/AssemblyB/AssemblyB.dll",
        new ReaderParameters { AssemblyResolver = resolver });
    

    这样您可以确保您的所有程序集共享一个公共解析器,该解析器知道在哪里可以找到您的程序集。 Resolve 也能正常工作。

    【讨论】:

    • 啊哈,我明白了。我在 Resolve 中遇到了 FileNotFoundException 错误,我认为这可能是因为它不知道该类的正确模块。但是,我不明白为什么解析不起作用,因为我通过 AssemblyDefinition.ReadAssembly 加载了 AssemblyA 和 AssemblyB。
    猜你喜欢
    • 2016-10-04
    • 2021-11-14
    • 1970-01-01
    • 2020-01-20
    • 2020-05-10
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多