gpt4 book ai didi

mono.cecil - 将 TypeReference 解析为 Mono.Cecil 中的 TypeDefinition 失败并出现程序集解析错误

转载 作者:行者123 更新时间:2023-12-05 06:24:50 25 4
gpt4 key购买 nike

我正在尝试从 .NET 类型获取 Mono.Cecil TypeDefinition,但没有成功。

我正在使用这样的代码:

var type = typeof(MarkdownMonster.AppConfiguration);

var a = AssemblyDefinition.ReadAssembly(type.Assembly.Location);
var tr = a.MainModule.Import(type); // this seems to work
var td = tr.Resolve(); // fails

但由于程序集解析错误而失败:

GetConfigurationPropertiesTest [0:29.990] Failed: Mono.Cecil.AssemblyResolutionException : Failed to resolve assembly: 'MarkdownMonster, Version=1.18.11.0, Culture=neutral, PublicKeyToken=null' Mono.Cecil.AssemblyResolutionException : Failed to resolve assembly: 'MarkdownMonster, Version=1.18.11.0, Culture=neutral, PublicKeyToken=null' at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters) at Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name) at Mono.Cecil.MetadataResolver.Resolve(TypeReference type) at Mono.Cecil.TypeReference.Resolve() at Westwind.TypeImporter.TypeParser.ParseObject(Type type, Boolean dontParseMembers)

程序集显然在那里,因为 TypeReference 导入似乎可以工作并生成有效的 TypeReference。

有问题的程序集是一个 EXE,为了好玩,我将它重命名为 DLL,但没有任何效果。

最佳答案

经过一些来回试验后,我发现一个(丑陋的)解决方案是创建一个自定义类型解析器,并基本上将硬类型引用强加到其中。一旦找到主程序集,Mono.Cecil 似乎能够解决 transient 依赖性,但不能解决顶级引用。

为了完成这项工作,我基本上传递了已经解析的程序集引用。在我的例子中,我知道我需要返回的唯一引用是顶级引用,所以我硬编码了它。一个更现实的例子必须使用 AssemblyDefinition.ReadAssembly() 从磁盘或流中读取程序集。

这是创建 AssemblyResolver 的代码:

    public class MonoAssemblyResolver : IAssemblyResolver
{
public AssemblyDefinition AssemblyDefinition;

public AssemblyDefinition Resolve(AssemblyNameReference name)
{
return AssemblyDefinition;
}

public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{

return AssemblyDefinition;
}

public void Dispose()
{
AssemblyDefinition = null;
}
}

注意在已解析的程序集引用中传递的欺骗。

要解决,我现在可以使用以下代码:

var a = AssemblyDefinition.ReadAssembly(type.Assembly.Location,
new ReaderParameters() { AssemblyResolver = resolver });

// assign the resolvedr
var resolver = new MonoAssemblyResolver();
resolver.AssemblyDefinition = a;

var tr = a.MainModule.Import(type: type);
var td = tr.Resolve(); // works now

这是疯狂的 hacky,但可以进行调整以使其更通用(在我的情况下不需要)。

如果 Mono.Cecil 可以自动解析程序集,那就更好了——我不明白为什么它没有首先找到程序集,因为它位于当前的 bin 文件夹中,并且 TypeReference 可以找到它。

关于mono.cecil - 将 TypeReference 解析为 Mono.Cecil 中的 TypeDefinition 失败并出现程序集解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57511037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com