【发布时间】:2016-06-25 22:20:59
【问题描述】:
感谢您抽出宝贵时间。
背景
我正在尝试在 Mono.Cecil 中创建一个新的 HttpClient,并将其添加到一个字段中。 这是我的代码:
TypeDefinition HttpClientDef = ModuleDefinition.GetType(typeof(HttpClient)).Resolve();
TypeDefinition def = GetSomeTypeDefinitionFromModule();
FieldDefinition field = new FieldDefinition($"${GENERATED_CLIENT_PATH}", FieldAttributes.Private, HttpClientDef);
def.Fields.Add(field);
这里没有问题,但是一旦void Execute()返回,就会抛出异常:成员'System.Net.Http.HttpClient'在另一个模块中声明,需要导入。。 p>
那又怎样?
我无法导入HttpClient。我尝试了很多事情,以下是我所知道的:
- ModuleDefinition 没有
System.Uri或System.Net.Http.HttpClient的定义,例如。 -
但是,我可以通过以下方式获得对
HttpClient的引用:AssemblyDefinition httpAssembly = AssemblyResolver.Resolve("System.Net.Http"); TypeDefinition HttpClientDef = httpAssembly.MainModule.GetType(typeof(HttpClient)); // fyi, HttpClient is also in httpAssembly.GetTypes(). -
一旦我有了一个有效的
TypeDefinition,我就不知道该怎么办了。-
ModuleDefinition.Import(def).Resolve()不会改变任何东西; -
new TypeReference(namespace, name, ModuleDefinition, httpAssembly.Name)也不起作用; - 也不直接调用
def。
-
有什么想法吗?
谢谢你,
格雷格。
编辑 1
如果代码中未使用类型的引用(在本例中为 System.Net.Http),则无法导入类型。
现在,我可以使用TypeDefinition def = ModuleDefinition.GetType(typeof(HttpClient)) 加载它。
【问题讨论】:
-
您使用的是哪个版本的 Mono.Cecil?在我的版本中,
ModuleDefinition.Import(...)(所有重载)被标记为已过时,替换为ImportReference(...)。 -
我的版本没有标记为过时的
Import方法,尽管我确实看到了有关此的博客文章。你也是从 Nuget 得到的,还是编译的?
标签: c# exception mono mono.cecil fody