0

谢谢你给我时间。

背景

我正在尝试在 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()返回,就会抛出异常:Member 'System.Net.Http.HttpClient' is declared in another module and needs to be imported

所以呢?

我无法导入HttpClient. 我已经尝试了很多事情,这就是我所知道的:

  • 例如, ModuleDefinition 没有System.Urior的定义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)).

4

2 回答 2

0

创建一个新的FieldDefinition只需要 aTypeReference而不是 a TypeDefinition,所以不需要调用Resolve()。尝试这个:

FieldDefinition field = 
    new FieldDefinition($"${GENERATED_CLIENT_PATH}",
    FieldAttributes.Private, 
    moduleDefn.Import(typeof(HttpClient));
于 2016-06-25T06:13:33.450 回答
0

出于某种原因,SystemSystem.Net.Http没有被引用,即使我已将它们添加为引用。在我的(修改后的)代码中显式使用HttpClient一次强制引用存在,之后我就能够做到Import

于 2016-06-25T14:20:59.600 回答